@@ -10,15 +10,18 @@ import (
10
10
"reflect"
11
11
"strconv"
12
12
"strings"
13
+ "sync"
14
+ "sync/atomic"
13
15
"testing"
14
16
"time"
15
17
16
- "github.com/go-mysql-org/go-mysql/client"
17
- "github.com/go-mysql-org/go-mysql/mysql"
18
- "github.com/go-mysql-org/go-mysql/server"
19
18
"github.com/pingcap/errors"
20
19
"github.com/siddontang/go/log"
21
20
"github.com/stretchr/testify/require"
21
+
22
+ "github.com/go-mysql-org/go-mysql/client"
23
+ "github.com/go-mysql-org/go-mysql/mysql"
24
+ "github.com/go-mysql-org/go-mysql/server"
22
25
)
23
26
24
27
var _ server.Handler = & mockHandler {}
@@ -32,15 +35,19 @@ type testServer struct {
32
35
33
36
type mockHandler struct {
34
37
// the number of times a query executed
35
- queryCount int
38
+ queryCount atomic.Int32
39
+ modifier * sync.WaitGroup
36
40
}
37
41
38
42
func TestDriverOptions_SetRetriesOn (t * testing.T ) {
39
43
log .SetLevel (log .LevelDebug )
40
44
srv := CreateMockServer (t )
41
45
defer srv .Stop ()
46
+ var wg sync.WaitGroup
47
+ srv .handler .modifier = & wg
48
+ wg .Add (3 )
42
49
43
- conn ,
err := sql .
Open (
"mysql" ,
"[email protected] :3307/test?readTimeout=1s " )
50
+ conn ,
err := sql .
Open (
"mysql" ,
"[email protected] :3307/test?readTimeout=100ms " )
44
51
defer func () {
45
52
_ = conn .Close ()
46
53
}()
@@ -52,17 +59,21 @@ func TestDriverOptions_SetRetriesOn(t *testing.T) {
52
59
// we want to get a golang database/sql/driver ErrBadConn
53
60
require .ErrorIs (t , err , sqlDriver .ErrBadConn )
54
61
62
+ wg .Wait ()
55
63
// here we issue assert that even though we only issued 1 query, that the retries
56
64
// remained on and there were 3 calls to the DB.
57
- require .Equal (t , 3 , srv .handler .queryCount )
65
+ require .EqualValues (t , 3 , srv .handler .queryCount . Load () )
58
66
}
59
67
60
68
func TestDriverOptions_SetRetriesOff (t * testing.T ) {
61
69
log .SetLevel (log .LevelDebug )
62
70
srv := CreateMockServer (t )
63
71
defer srv .Stop ()
72
+ var wg sync.WaitGroup
73
+ srv .handler .modifier = & wg
74
+ wg .Add (1 )
64
75
65
- conn ,
err := sql .
Open (
"mysql" ,
"[email protected] :3307/test?readTimeout=1s &retries=off" )
76
+ conn ,
err := sql .
Open (
"mysql" ,
"[email protected] :3307/test?readTimeout=100ms &retries=off" )
66
77
defer func () {
67
78
_ = conn .Close ()
68
79
}()
@@ -73,9 +84,10 @@ func TestDriverOptions_SetRetriesOff(t *testing.T) {
73
84
// we want the native error from this driver implementation
74
85
require .ErrorIs (t , err , mysql .ErrBadConn )
75
86
87
+ wg .Wait ()
76
88
// here we issue assert that even though we only issued 1 query, that the retries
77
89
// remained on and there were 3 calls to the DB.
78
- require .Equal (t , 1 , srv .handler .queryCount )
90
+ require .EqualValues (t , 1 , srv .handler .queryCount . Load () )
79
91
}
80
92
81
93
func TestDriverOptions_SetCollation (t * testing.T ) {
@@ -153,7 +165,7 @@ func TestDriverOptions_ReadTimeout(t *testing.T) {
153
165
srv := CreateMockServer (t )
154
166
defer srv .Stop ()
155
167
156
- conn ,
err := sql .
Open (
"mysql" ,
"[email protected] :3307/test?readTimeout=1s " )
168
+ conn ,
err := sql .
Open (
"mysql" ,
"[email protected] :3307/test?readTimeout=100ms " )
157
169
defer func () {
158
170
_ = conn .Close ()
159
171
}()
@@ -309,7 +321,13 @@ func (h *mockHandler) UseDB(dbName string) error {
309
321
}
310
322
311
323
func (h * mockHandler ) handleQuery (query string , binary bool , args []interface {}) (* mysql.Result , error ) {
312
- h .queryCount ++
324
+ defer func () {
325
+ if h .modifier != nil {
326
+ h .modifier .Done ()
327
+ }
328
+ }()
329
+
330
+ h .queryCount .Add (1 )
313
331
ss := strings .Split (query , " " )
314
332
switch strings .ToLower (ss [0 ]) {
315
333
case "select" :
@@ -327,7 +345,7 @@ func (h *mockHandler) handleQuery(query string, binary bool, args []interface{})
327
345
}, binary )
328
346
} else {
329
347
if strings .Contains (query , "slow" ) {
330
- time .Sleep (time .Second * 5 )
348
+ time .Sleep (time .Second )
331
349
}
332
350
333
351
var aValue uint64 = 1
0 commit comments