Skip to content

Commit 31cefae

Browse files
feat: aurora connection tracker plugin (#272)
1 parent 540a1fe commit 31cefae

File tree

16 files changed

+963
-30
lines changed

16 files changed

+963
-30
lines changed
Lines changed: 104 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,104 @@
1+
/*
2+
Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
3+
4+
Licensed under the Apache License, Version 2.0 (the "License").
5+
You may not use this file except in compliance with the License.
6+
You may obtain a copy of the License at
7+
8+
http://www.apache.org/licenses/LICENSE-2.0
9+
10+
Unless required by applicable law or agreed to in writing, software
11+
distributed under the License is distributed on an "AS IS" BASIS,
12+
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13+
See the License for the specific language governing permissions and
14+
limitations under the License.
15+
*/
16+
17+
package test
18+
19+
import (
20+
"database/sql/driver"
21+
"testing"
22+
23+
mock_driver_infrastructure "github.com/aws/aws-advanced-go-wrapper/.test/test/mocks/awssql/driver_infrastructure"
24+
mock_connection_tracker "github.com/aws/aws-advanced-go-wrapper/.test/test/mocks/awssql/plugins/connection_tracker"
25+
mock_database_sql_driver "github.com/aws/aws-advanced-go-wrapper/.test/test/mocks/database_sql_driver"
26+
"github.com/aws/aws-advanced-go-wrapper/awssql/error_util"
27+
"github.com/aws/aws-advanced-go-wrapper/awssql/host_info_util"
28+
"github.com/aws/aws-advanced-go-wrapper/awssql/plugins"
29+
"github.com/aws/aws-advanced-go-wrapper/awssql/utils"
30+
"github.com/golang/mock/gomock"
31+
"github.com/stretchr/testify/assert"
32+
)
33+
34+
func TestAuroraConnectionTracker_TrackNewInstanceConnections(t *testing.T) {
35+
ctrl := gomock.NewController(t)
36+
defer ctrl.Finish()
37+
mockPluginService := mock_driver_infrastructure.NewMockPluginService(ctrl)
38+
mockTracker := mock_connection_tracker.NewMockConnectionTracker(ctrl)
39+
mockDriverConn := mock_database_sql_driver.NewMockConn(ctrl)
40+
props := MakeMapFromKeysAndVals(
41+
"someKey", "someVal",
42+
)
43+
connectFunc := func(props *utils.RWMap[string, string]) (driver.Conn, error) {
44+
return mockDriverConn, nil
45+
}
46+
hostInfo := &host_info_util.HostInfo{Role: host_info_util.WRITER, Host: "writer1"}
47+
48+
mockPluginService.EXPECT().FillAliases(mockDriverConn, hostInfo)
49+
mockTracker.EXPECT().PopulateOpenedConnectionQueue(hostInfo, mockDriverConn)
50+
51+
auroraConnectionTracker := plugins.NewAuroraConnectionTrackerPlugin(mockPluginService, nil, mockTracker)
52+
conn, err := auroraConnectionTracker.Connect(hostInfo, props, true, connectFunc)
53+
assert.NoError(t, err)
54+
assert.Equal(t, conn, mockDriverConn)
55+
assert.Equal(t, 0, len(hostInfo.Aliases))
56+
}
57+
58+
func TestAuroraConnectionTracker_InvalidateOpenedConnectionsWhenWriterHostNotChange(t *testing.T) {
59+
ctrl := gomock.NewController(t)
60+
defer ctrl.Finish()
61+
mockPluginService := mock_driver_infrastructure.NewMockPluginService(ctrl)
62+
mockTracker := mock_connection_tracker.NewMockConnectionTracker(ctrl)
63+
mockDriverConn := mock_database_sql_driver.NewMockConn(ctrl)
64+
65+
failoverError := &error_util.AwsWrapperError{ErrorType: error_util.FailoverSuccessError.ErrorType}
66+
execFunc := func() (any, any, bool, error) {
67+
return "test1", "test2", true, failoverError
68+
}
69+
70+
originalHost := &host_info_util.HostInfo{Role: host_info_util.WRITER, Host: "originalHost"}
71+
72+
mockPluginService.EXPECT().GetHosts().Return([]*host_info_util.HostInfo{originalHost}).Times(2)
73+
74+
auroraConnectionTracker := plugins.NewAuroraConnectionTrackerPlugin(mockPluginService, nil, mockTracker)
75+
_, _, _, err := auroraConnectionTracker.Execute(mockDriverConn, "", execFunc, "")
76+
assert.Error(t, err)
77+
assert.Equal(t, failoverError, err)
78+
}
79+
80+
func TestAuroraConnectionTracker_InvalidateOpenedConnectionsWhenWriterHostChanged(t *testing.T) {
81+
ctrl := gomock.NewController(t)
82+
defer ctrl.Finish()
83+
mockPluginService := mock_driver_infrastructure.NewMockPluginService(ctrl)
84+
mockTracker := mock_connection_tracker.NewMockConnectionTracker(ctrl)
85+
mockDriverConn := mock_database_sql_driver.NewMockConn(ctrl)
86+
87+
failoverError := &error_util.AwsWrapperError{ErrorType: error_util.FailoverSuccessError.ErrorType}
88+
execFunc := func() (any, any, bool, error) {
89+
return "test1", "test2", true, failoverError
90+
}
91+
92+
originalHost := &host_info_util.HostInfo{Role: host_info_util.WRITER, Host: "originalHost"}
93+
newHost := &host_info_util.HostInfo{Role: host_info_util.WRITER, Host: "newHost"}
94+
95+
mockPluginService.EXPECT().GetHosts().Return([]*host_info_util.HostInfo{originalHost})
96+
mockPluginService.EXPECT().GetHosts().Return([]*host_info_util.HostInfo{newHost})
97+
mockTracker.EXPECT().InvalidateAllConnections(originalHost)
98+
mockTracker.EXPECT().LogOpenedConnections()
99+
100+
auroraConnectionTracker := plugins.NewAuroraConnectionTrackerPlugin(mockPluginService, nil, mockTracker)
101+
_, _, _, err := auroraConnectionTracker.Execute(mockDriverConn, "", execFunc, "")
102+
assert.Error(t, err)
103+
assert.Equal(t, failoverError, err)
104+
}

.test/test/mocks/awssql/plugins/connection_tracker/mock_connection_tracker.go

Lines changed: 127 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

0 commit comments

Comments
 (0)