Skip to content

Commit de8461d

Browse files
committed
Added type wire tests
1 parent aa21cd8 commit de8461d

File tree

8 files changed

+904
-33
lines changed

8 files changed

+904
-33
lines changed

enginetest/enginetests.go

+110
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@ package enginetest
1717
import (
1818
"context"
1919
"fmt"
20+
"io"
2021
"net"
2122
"strings"
2223
"testing"
@@ -5392,6 +5393,115 @@ func TestPrepared(t *testing.T, harness Harness) {
53925393
}
53935394
}
53945395

5396+
func TestTypesOverWire(t *testing.T, h Harness, sessionBuilder server.SessionBuilder) {
5397+
harness, ok := h.(ClientHarness)
5398+
if !ok {
5399+
t.Skip("Cannot run TestTypesOverWire as the harness must implement ClientHarness")
5400+
}
5401+
harness.Setup(setup.MydbData)
5402+
5403+
port := getEmptyPort(t)
5404+
for _, script := range queries.TypeWireTests {
5405+
t.Run(script.Name, func(t *testing.T) {
5406+
ctx := NewContextWithClient(harness, sql.Client{
5407+
User: "root",
5408+
Address: "localhost",
5409+
})
5410+
serverConfig := server.Config{
5411+
Protocol: "tcp",
5412+
Address: fmt.Sprintf("localhost:%d", port),
5413+
MaxConnections: 1000,
5414+
}
5415+
5416+
engine := mustNewEngine(t, harness)
5417+
defer engine.Close()
5418+
engine.Analyzer.Catalog.MySQLDb.AddRootAccount()
5419+
for _, statement := range script.SetUpScript {
5420+
if sh, ok := harness.(SkippingHarness); ok {
5421+
if sh.SkipQueryTest(statement) {
5422+
t.Skip()
5423+
}
5424+
}
5425+
RunQueryWithContext(t, engine, harness, ctx, statement)
5426+
}
5427+
5428+
s, err := server.NewServer(serverConfig, engine, sessionBuilder, nil)
5429+
require.NoError(t, err)
5430+
go func() {
5431+
err := s.Start()
5432+
require.NoError(t, err)
5433+
}()
5434+
defer func() {
5435+
require.NoError(t, s.Close())
5436+
}()
5437+
5438+
conn, err := dbr.Open("mysql", fmt.Sprintf("root:@tcp(localhost:%d)/", port), nil)
5439+
require.NoError(t, err)
5440+
_, err = conn.Exec("USE mydb;")
5441+
require.NoError(t, err)
5442+
for queryIdx, query := range script.Queries {
5443+
r, err := conn.Query(query)
5444+
if assert.NoError(t, err) {
5445+
sch, engineIter, err := engine.Query(ctx, query)
5446+
require.NoError(t, err)
5447+
expectedRowSet := script.Results[queryIdx]
5448+
expectedRowIdx := 0
5449+
var engineRow sql.Row
5450+
for engineRow, err = engineIter.Next(ctx); err == nil; engineRow, err = engineIter.Next(ctx) {
5451+
if !assert.True(t, r.Next()) {
5452+
break
5453+
}
5454+
expectedRow := expectedRowSet[expectedRowIdx]
5455+
expectedRowIdx++
5456+
connRow := make([]*string, len(engineRow))
5457+
interfaceRow := make([]any, len(connRow))
5458+
for i := range connRow {
5459+
interfaceRow[i] = &connRow[i]
5460+
}
5461+
err = r.Scan(interfaceRow...)
5462+
if !assert.NoError(t, err) {
5463+
break
5464+
}
5465+
expectedEngineRow := make([]*string, len(engineRow))
5466+
for i := range engineRow {
5467+
sqlVal, err := sch[i].Type.SQL(nil, engineRow[i])
5468+
if !assert.NoError(t, err) {
5469+
break
5470+
}
5471+
if !sqlVal.IsNull() {
5472+
str := sqlVal.ToString()
5473+
expectedEngineRow[i] = &str
5474+
}
5475+
}
5476+
5477+
for i := range expectedEngineRow {
5478+
expectedVal := expectedEngineRow[i]
5479+
connVal := connRow[i]
5480+
if !assert.Equal(t, expectedVal == nil, connVal == nil) {
5481+
continue
5482+
}
5483+
if expectedVal != nil {
5484+
assert.Equal(t, *expectedVal, *connVal)
5485+
if script.Name == "JSON" {
5486+
// Different integrators may return their JSON strings with different spacing, so we
5487+
// special case the test since the spacing is not significant
5488+
*connVal = strings.Replace(*connVal, `, `, `,`, -1)
5489+
*connVal = strings.Replace(*connVal, `: "`, `:"`, -1)
5490+
}
5491+
assert.Equal(t, expectedRow[i], *connVal)
5492+
}
5493+
}
5494+
}
5495+
assert.True(t, err == io.EOF)
5496+
assert.False(t, r.Next())
5497+
require.NoError(t, r.Close())
5498+
}
5499+
}
5500+
require.NoError(t, conn.Close())
5501+
})
5502+
}
5503+
}
5504+
53955505
type memoryPersister struct {
53965506
users []*mysql_db.User
53975507
roles []*mysql_db.RoleEdge

enginetest/memory_engine_test.go

+6-2
Original file line numberDiff line numberDiff line change
@@ -19,11 +19,11 @@ import (
1919
"log"
2020
"testing"
2121

22-
"github.com/dolthub/go-mysql-server/enginetest/scriptgen/setup"
23-
2422
"github.com/dolthub/go-mysql-server/enginetest"
2523
"github.com/dolthub/go-mysql-server/enginetest/queries"
24+
"github.com/dolthub/go-mysql-server/enginetest/scriptgen/setup"
2625
"github.com/dolthub/go-mysql-server/memory"
26+
"github.com/dolthub/go-mysql-server/server"
2727
"github.com/dolthub/go-mysql-server/sql"
2828
"github.com/dolthub/go-mysql-server/sql/analyzer"
2929
"github.com/dolthub/go-mysql-server/sql/expression"
@@ -751,6 +751,10 @@ func TestKeylessUniqueIndex(t *testing.T) {
751751
enginetest.TestKeylessUniqueIndex(t, enginetest.NewDefaultMemoryHarness())
752752
}
753753

754+
func TestTypesOverWire(t *testing.T) {
755+
enginetest.TestTypesOverWire(t, enginetest.NewDefaultMemoryHarness(), server.DefaultSessionBuilder)
756+
}
757+
754758
func mergableIndexDriver(dbs []sql.Database) sql.IndexDriver {
755759
return memory.NewIndexDriver("mydb", map[string][]sql.DriverIndex{
756760
"mytable": {

enginetest/mysqlshim/connection.go

+4
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,10 @@ func NewMySQLShim(user string, password string, host string, port int) (*MySQLSh
4040
if err != nil {
4141
return nil, err
4242
}
43+
err = conn.Ping()
44+
if err != nil {
45+
return nil, err
46+
}
4347
return &MySQLShim{conn, make(map[string]string)}, nil
4448
}
4549

enginetest/mysqlshim/iter.go

+4-4
Original file line numberDiff line numberDiff line change
@@ -45,12 +45,12 @@ func newMySQLIter(rows *dsql.Rows) mysqlIter {
4545
scanType = reflect.TypeOf("")
4646
case reflect.TypeOf(dsql.NullBool{}):
4747
scanType = reflect.TypeOf(true)
48-
//case reflect.TypeOf(dsql.NullByte{}): // Not supported in go 1.15, need to upgrade to 1.17
49-
// scanType = reflect.TypeOf(byte(0))
48+
case reflect.TypeOf(dsql.NullByte{}):
49+
scanType = reflect.TypeOf(byte(0))
5050
case reflect.TypeOf(dsql.NullFloat64{}):
5151
scanType = reflect.TypeOf(float64(0))
52-
//case reflect.TypeOf(dsql.NullInt16{}): // Not supported in go 1.15, need to upgrade to 1.17
53-
// scanType = reflect.TypeOf(int16(0))
52+
case reflect.TypeOf(dsql.NullInt16{}):
53+
scanType = reflect.TypeOf(int16(0))
5454
case reflect.TypeOf(dsql.NullInt32{}):
5555
scanType = reflect.TypeOf(int32(0))
5656
case reflect.TypeOf(dsql.NullInt64{}):

enginetest/mysqlshim/mysql_harness.go

+35-13
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@
1515
package mysqlshim
1616

1717
import (
18+
"context"
1819
"fmt"
1920
"strings"
2021
"testing"
@@ -30,16 +31,36 @@ import (
3031
type MySQLHarness struct {
3132
shim *MySQLShim
3233
skippedQueries map[string]struct{}
34+
setupData []setup.SetupScript
35+
session sql.Session
3336
}
3437

35-
func (m *MySQLHarness) Setup(source ...[]setup.SetupScript) {
36-
//TODO implement me
37-
panic("implement me")
38+
//TODO: refactor to remove enginetest cycle
39+
var _ enginetest.Harness = (*MySQLHarness)(nil)
40+
var _ enginetest.IndexHarness = (*MySQLHarness)(nil)
41+
var _ enginetest.ForeignKeyHarness = (*MySQLHarness)(nil)
42+
var _ enginetest.KeylessTableHarness = (*MySQLHarness)(nil)
43+
var _ enginetest.ClientHarness = (*MySQLHarness)(nil)
44+
var _ enginetest.SkippingHarness = (*MySQLHarness)(nil)
45+
46+
func (m *MySQLHarness) Setup(setupData ...[]setup.SetupScript) {
47+
m.setupData = nil
48+
for i := range setupData {
49+
m.setupData = append(m.setupData, setupData[i]...)
50+
}
51+
return
3852
}
3953

4054
func (m *MySQLHarness) NewEngine(t *testing.T) (*sqle.Engine, error) {
41-
//TODO implement me
42-
panic("implement me")
55+
return enginetest.NewEngineWithProviderSetup(t, m, m.shim, m.setupData)
56+
}
57+
58+
func (m *MySQLHarness) NewContextWithClient(client sql.Client) *sql.Context {
59+
session := sql.NewBaseSessionWithClientServer("address", client, 1)
60+
return sql.NewContext(
61+
context.Background(),
62+
sql.WithSession(session),
63+
)
4364
}
4465

4566
func (m *MySQLHarness) Cleanup() error {
@@ -58,19 +79,13 @@ type MySQLTable struct {
5879
tableName string
5980
}
6081

61-
var _ enginetest.Harness = (*MySQLHarness)(nil)
62-
var _ enginetest.SkippingHarness = (*MySQLHarness)(nil)
63-
var _ enginetest.IndexHarness = (*MySQLHarness)(nil)
64-
var _ enginetest.ForeignKeyHarness = (*MySQLHarness)(nil)
65-
var _ enginetest.KeylessTableHarness = (*MySQLHarness)(nil)
66-
6782
// NewMySQLHarness returns a new MySQLHarness.
6883
func NewMySQLHarness(user string, password string, host string, port int) (*MySQLHarness, error) {
6984
shim, err := NewMySQLShim(user, password, host, port)
7085
if err != nil {
7186
return nil, err
7287
}
73-
return &MySQLHarness{shim, make(map[string]struct{})}, nil
88+
return &MySQLHarness{shim, make(map[string]struct{}), nil, nil}, nil
7489
}
7590

7691
// Parallelism implements the interface Harness.
@@ -126,7 +141,14 @@ func (m *MySQLHarness) NewTable(db sql.Database, name string, schema sql.Primary
126141

127142
// NewContext implements the interface Harness.
128143
func (m *MySQLHarness) NewContext() *sql.Context {
129-
return sql.NewEmptyContext()
144+
if m.session == nil {
145+
m.session = enginetest.NewBaseSession()
146+
}
147+
148+
return sql.NewContext(
149+
context.Background(),
150+
sql.WithSession(m.session),
151+
)
130152
}
131153

132154
// SkipQueryTest implements the interface SkippingHarness.

0 commit comments

Comments
 (0)