This repository was archived by the owner on Jan 28, 2021. It is now read-only.
-
Notifications
You must be signed in to change notification settings - Fork 109
/
Copy pathhandler_test_common.go
108 lines (90 loc) · 2.33 KB
/
handler_test_common.go
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
package server
import (
"io/ioutil"
"net"
"reflect"
"strconv"
"testing"
"unsafe"
sqle "github.com/src-d/go-mysql-server"
"github.com/src-d/go-mysql-server/memory"
"github.com/src-d/go-mysql-server/sql"
"github.com/stretchr/testify/require"
"vitess.io/vitess/go/mysql"
)
func setupMemDB(require *require.Assertions) *sqle.Engine {
e := sqle.NewDefault()
db := memory.NewDatabase("test")
e.AddDatabase(db)
tableTest := memory.NewTable("test", sql.Schema{{Name: "c1", Type: sql.Int32, Source: "test"}})
for i := 0; i < 1010; i++ {
require.NoError(tableTest.Insert(
sql.NewEmptyContext(),
sql.NewRow(int32(i)),
))
}
db.AddTable("test", tableTest)
return e
}
func getFreePort() (string, error) {
addr, err := net.ResolveTCPAddr("tcp", "localhost:0")
if err != nil {
return "", err
}
l, err := net.ListenTCP("tcp", addr)
if err != nil {
return "", err
}
defer l.Close()
return strconv.Itoa(l.Addr().(*net.TCPAddr).Port), nil
}
func testServer(t *testing.T, ready chan struct{}, port string, breakConn bool) {
l, err := net.Listen("tcp", ":"+port)
defer func() {
_ = l.Close()
}()
if err != nil {
t.Fatal(err)
}
close(ready)
conn, err := l.Accept()
if err != nil {
return
}
if !breakConn {
defer func() {
_ = conn.Close()
}()
_, err = ioutil.ReadAll(conn)
if err != nil {
t.Fatal(err)
}
} // else: dirty return without closing or reading to force the socket into TIME_WAIT
}
func okTestServer(t *testing.T, ready chan struct{}, port string) {
testServer(t, ready, port, false)
}
func brokenTestServer(t *testing.T, ready chan struct{}, port string) {
testServer(t, ready, port, true)
}
// This session builder is used as dummy mysql Conn is not complete and
// causes panic when accessing remote address.
func testSessionBuilder(c *mysql.Conn, addr string) sql.Session {
const client = "127.0.0.1:34567"
return sql.NewSession(addr, client, c.User, c.ConnectionID)
}
type mockConn struct {
net.Conn
}
func (c *mockConn) Close() error { return nil }
func newConn(id uint32) *mysql.Conn {
conn := &mysql.Conn{
ConnectionID: id,
}
// Set conn so it does not panic when we close it
val := reflect.ValueOf(conn).Elem()
field := val.FieldByName("conn")
field = reflect.NewAt(field.Type(), unsafe.Pointer(field.UnsafeAddr())).Elem()
field.Set(reflect.ValueOf(new(mockConn)))
return conn
}