Skip to content

Commit b216bf1

Browse files
committed
tests
1 parent 9e99ae3 commit b216bf1

3 files changed

Lines changed: 145 additions & 6 deletions

File tree

driver_discovery_client_test.go

Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ import (
77

88
"github.com/stretchr/testify/require"
99

10+
"github.com/ydb-platform/ydb-go-sdk/v3/balancers"
1011
"github.com/ydb-platform/ydb-go-sdk/v3/config"
1112
"github.com/ydb-platform/ydb-go-sdk/v3/internal/conn"
1213
internalDiscovery "github.com/ydb-platform/ydb-go-sdk/v3/internal/discovery"
@@ -40,6 +41,40 @@ func TestDriverDiscoveryClientCloseReleasesBootstrapRef(t *testing.T) {
4041
require.NotSame(t, bootstrap, again)
4142
}
4243

44+
func TestDriverConnectInitializesDiscoveryClient(t *testing.T) {
45+
ctx := context.Background()
46+
cfg := config.New(
47+
config.WithEndpoint("bootstrap:2135"),
48+
config.WithDatabase("/local"),
49+
config.WithBalancer(balancers.SingleConn()),
50+
)
51+
pool := conn.NewPool(ctx, cfg)
52+
53+
d := &Driver{
54+
config: cfg,
55+
pool: pool,
56+
metaBalancer: &balancerWithMeta{
57+
meta: cfg.Meta(),
58+
close: func(context.Context) error {
59+
return nil
60+
},
61+
},
62+
}
63+
64+
require.NoError(t, d.connect(ctx))
65+
t.Cleanup(func() {
66+
require.NoError(t, d.metaBalancer.Close(ctx))
67+
})
68+
69+
discoveryClient, err := d.discovery.Get()
70+
require.NoError(t, err)
71+
require.NotNil(t, discoveryClient)
72+
require.NotNil(t, discoveryClient.conn)
73+
74+
require.NoError(t, discoveryClient.Close(ctx))
75+
require.NoError(t, pool.RemoveRef(ctx))
76+
}
77+
4378
func TestDriverDiscoveryInitFailsWhenPoolClosed(t *testing.T) {
4479
ctx := context.Background()
4580
pool := conn.NewPool(ctx, config.New())

internal/conn/pool.go

Lines changed: 13 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -267,6 +267,18 @@ func (p *Pool) closeConnsForFailedResolve(ctx context.Context, target string) {
267267
}
268268
}
269269

270+
func (p *Pool) onResolveCallback(
271+
ctx context.Context,
272+
start trace.DriverResolveStartInfo,
273+
) func(trace.DriverResolveDoneInfo) {
274+
target := start.Target
275+
resolved := start.Resolved
276+
277+
return func(info trace.DriverResolveDoneInfo) {
278+
p.onResolveDone(ctx, target, resolved, info)
279+
}
280+
}
281+
270282
func (p *Pool) onResolveDone(ctx context.Context, target string, resolved []string, info trace.DriverResolveDoneInfo) {
271283
if info.Error != nil || len(resolved) == 0 {
272284
// Reset gRPC transport only; keep map entries and useCount unchanged.
@@ -294,12 +306,7 @@ func NewPool(ctx context.Context, config Config) *Pool {
294306
grpc.WithResolvers(
295307
xresolver.New("", gtrace.Compose(config.Trace(), &trace.Driver{
296308
OnResolve: func(info trace.DriverResolveStartInfo) func(trace.DriverResolveDoneInfo) {
297-
target := info.Target
298-
resolved := info.Resolved
299-
300-
return func(info trace.DriverResolveDoneInfo) {
301-
p.onResolveDone(ctx, target, resolved, info)
302-
}
309+
return p.onResolveCallback(ctx, info)
303310
},
304311
})),
305312
),

internal/conn/pool_test.go

Lines changed: 97 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@ import (
1010

1111
"github.com/stretchr/testify/require"
1212
"google.golang.org/grpc"
13+
"google.golang.org/grpc/connectivity"
1314

1415
"github.com/ydb-platform/ydb-go-sdk/v3/internal/conn/state"
1516
"github.com/ydb-platform/ydb-go-sdk/v3/internal/endpoint"
@@ -999,3 +1000,99 @@ func TestPool_EndpointsToConnectionsNilMap(t *testing.T) {
9991000
e := endpoint.New("closed:2135")
10001001
require.Empty(t, endpointsToConnections(pool, []endpoint.Endpoint{e}))
10011002
}
1003+
1004+
func TestPool_AddRefReturnsErrorWhenClosed(t *testing.T) {
1005+
ctx := context.Background()
1006+
pool := NewPool(ctx, &mockConfig{})
1007+
require.NoError(t, pool.RemoveRef(ctx))
1008+
1009+
err := pool.AddRef(ctx)
1010+
require.ErrorIs(t, err, ErrClosedPool)
1011+
}
1012+
1013+
func TestPool_RemoveRefReturnsCloseErrors(t *testing.T) {
1014+
ctx := context.Background()
1015+
pool := NewPool(ctx, &mockConfig{})
1016+
1017+
e := endpoint.New("close-error:2135")
1018+
cc := newConn(e, pool)
1019+
cc.mtx.Lock()
1020+
cc.grpcConn = &mockGrpcConn{closeErr: errors.New("grpc close failed")}
1021+
cc.mtx.Unlock()
1022+
1023+
pool.mu.Lock()
1024+
pool.conns[e.Key()] = &connValue{cc: cc}
1025+
pool.mu.Unlock()
1026+
1027+
err := pool.RemoveRef(ctx)
1028+
require.Error(t, err)
1029+
require.Contains(t, err.Error(), "connection pool close failed")
1030+
}
1031+
1032+
func TestPool_OnResolveCallback(t *testing.T) {
1033+
ctx := context.Background()
1034+
pool := NewPool(ctx, &mockConfig{})
1035+
defer func() {
1036+
_ = pool.RemoveRef(ctx)
1037+
}()
1038+
1039+
target := "localhost:2135"
1040+
e := endpoint.New(target)
1041+
_ = pool.Get(e)
1042+
1043+
done := pool.onResolveCallback(ctx, trace.DriverResolveStartInfo{
1044+
Target: target,
1045+
Resolved: []string{target},
1046+
})
1047+
done(trace.DriverResolveDoneInfo{Error: errors.New("resolve failed")})
1048+
1049+
require.True(t, testPoolHasConn(pool, e.Key()))
1050+
}
1051+
1052+
func TestPool_CloseConnsForFailedResolveSkipsAlreadyClosed(t *testing.T) {
1053+
ctx := context.Background()
1054+
pool := NewPool(ctx, &mockConfig{})
1055+
defer func() {
1056+
_ = pool.RemoveRef(ctx)
1057+
}()
1058+
1059+
target := "localhost:2135"
1060+
e := endpoint.New(target)
1061+
cc := newConn(e, pool)
1062+
cc.mtx.Lock()
1063+
cc.closed = true
1064+
cc.mtx.Unlock()
1065+
1066+
pool.mu.Lock()
1067+
pool.conns[e.Key()] = &connValue{cc: cc}
1068+
pool.mu.Unlock()
1069+
1070+
require.NotPanics(t, func() {
1071+
pool.closeConnsForFailedResolve(ctx, target)
1072+
})
1073+
}
1074+
1075+
type mockGrpcConn struct {
1076+
closeErr error
1077+
}
1078+
1079+
func (m *mockGrpcConn) Invoke(context.Context, string, any, any, ...grpc.CallOption) error {
1080+
return nil
1081+
}
1082+
1083+
func (m *mockGrpcConn) NewStream(
1084+
context.Context,
1085+
*grpc.StreamDesc,
1086+
string,
1087+
...grpc.CallOption,
1088+
) (grpc.ClientStream, error) {
1089+
return nil, errors.New("not implemented")
1090+
}
1091+
1092+
func (m *mockGrpcConn) Close() error {
1093+
return m.closeErr
1094+
}
1095+
1096+
func (m *mockGrpcConn) GetState() connectivity.State {
1097+
return connectivity.Ready
1098+
}

0 commit comments

Comments
 (0)