integration-tests/go-sql-server-driver: Move Server definitions to TestRepo/MultiRepo, instead of a separate top-level field.

This commit is contained in:
Aaron Son
2022-10-03 12:04:35 -07:00
parent 87de2bb7d9
commit 7ebc1bb45f
4 changed files with 120 additions and 123 deletions

View File

@@ -170,6 +170,7 @@ type SqlServer struct {
Cmd *exec.Cmd
Port int
Output *bytes.Buffer
DBName string
RecreateCmd func(args ...string) *exec.Cmd
}
@@ -276,8 +277,8 @@ func (s *SqlServer) Restart(newargs *[]string) error {
return s.Cmd.Start()
}
func (s *SqlServer) DB(dbname string) (*sql.DB, error) {
db, err := sql.Open("mysql", fmt.Sprintf("root@tcp(127.0.0.1:%d)/%s", s.Port, dbname))
func (s *SqlServer) DB() (*sql.DB, error) {
db, err := sql.Open("mysql", fmt.Sprintf("root@tcp(127.0.0.1:%d)/%s", s.Port, s.DBName))
if err != nil {
return nil, err
}

View File

@@ -31,13 +31,13 @@ type TestDef struct {
Tests []Test `yaml:"tests"`
}
// Test is a single test to run, with steup in the form of |Repos|,
// |MultiRepos| and |Servers|, and assertions in the form of |Conns|.
// Test is a single test to run. The Repos and MultiRepos will be created, and
// any Servers defined within them will be started. The interactions and
// assertions defined in Conns will be run.
type Test struct {
Name string `yaml:"name"`
Repos []TestRepo `yaml:"repos"`
MultiRepos []MultiRepo `yaml:"multi_repos"`
Servers []Server `yaml:"servers"`
Conns []Connection `yaml:"connections"`
}
@@ -67,6 +67,11 @@ type TestRepo struct {
Name string `yaml:"name"`
WithFiles []WithFile `yaml:"with_files"`
WithRemotes []WithRemote `yaml:"with_remotes"`
// Only valid on Test.Repos, not in Test.MultiRepos.Repos. If set, a
// sql-server process will be run against this TestRepo. It will be
// available as TestRepo.Name.
Server *Server `yaml:"server"`
}
// |MultiRepo| is a subdirectory where many |TestRepo|s can be defined. You can
@@ -76,6 +81,10 @@ type MultiRepo struct {
Name string `yaml:"name"`
Repos []TestRepo `yaml:"repos"`
WithFiles []WithFile `yaml:"with_files"`
// If set, a sql-server process will be run against this TestRepo. It
// will be available as MultiRepo.Name.
Server *Server `yaml:"server"`
}
// |WithRemote| defines remotes which should be defined on the repository
@@ -173,6 +182,36 @@ func MakeRepo(t *testing.T, rs RepoStore, r TestRepo) Repo {
return repo
}
func MakeServer(t *testing.T, dc DoltCmdable, s *Server) (*SqlServer, func()) {
if s == nil {
return nil, nil
}
opts := []SqlServerOpt{WithArgs(s.Args...)}
if s.Port != 0 {
opts = append(opts, WithPort(s.Port))
}
server, err := StartSqlServer(dc, opts...)
require.NoError(t, err)
if len(s.ErrorMatches) > 0 {
err := server.ErrorStop()
require.Error(t, err)
output := string(server.Output.Bytes())
for _, a := range s.ErrorMatches {
require.Regexp(t, a, output)
}
return nil, nil
} else {
return server, func() {
err := server.GracefulStop()
require.NoError(t, err)
output := string(server.Output.Bytes())
for _, a := range s.LogMatches {
require.Regexp(t, a, output)
}
}
}
}
func RunTestsFile(t *testing.T, path string) {
def, err := ParseTestsFile(path)
require.NoError(t, err)
@@ -182,9 +221,19 @@ func RunTestsFile(t *testing.T, path string) {
require.NoError(t, err)
rs, err := u.MakeRepoStore()
require.NoError(t, err)
doltlocs := make(map[string]DoltCmdable)
servers := make(map[string]*SqlServer)
for _, r := range test.Repos {
doltlocs[r.Name] = MakeRepo(t, rs, r)
repo := MakeRepo(t, rs, r)
doltlocs[r.Name] = repo
server, close := MakeServer(t, repo, r.Server)
if server != nil {
server.DBName = r.Name
servers[r.Name] = server
defer close()
}
}
for _, mr := range test.MultiRepos {
// Each MultiRepo gets its own dolt config --global.
@@ -199,53 +248,26 @@ func RunTestsFile(t *testing.T, path string) {
require.NoError(t, rs.WriteFile(f.Name, f.Contents))
}
doltlocs[mr.Name] = rs
}
servers := make(map[string]*SqlServer)
for _, sl := range test.Servers {
s := sl
var server *SqlServer
opts := []SqlServerOpt{WithArgs(s.Args...)}
if sl.Port != 0 {
opts = append(opts, WithPort(sl.Port))
}
server, err = StartSqlServer(doltlocs[s.Name], opts...)
require.NoError(t, err)
if len(s.ErrorMatches) > 0 {
err := server.ErrorStop()
require.Error(t, err)
output := string(server.Output.Bytes())
for _, a := range s.ErrorMatches {
require.Regexp(t, a, output)
}
} else {
servers[s.Name] = server
defer func() {
err := server.GracefulStop()
require.NoError(t, err)
output := string(server.Output.Bytes())
for _, a := range s.LogMatches {
require.Regexp(t, a, output)
}
}()
server, close := MakeServer(t, rs, mr.Server)
if server != nil {
servers[mr.Name] = server
defer close()
}
}
dbs := make(map[string]*sql.DB)
defer func() {
for _, db := range dbs {
db.Close()
}
}()
for nl, s := range servers {
n := nl
dbname := n
_, ismultirepo := doltlocs[n].(RepoStore)
if ismultirepo {
dbname = ""
}
db, err := s.DB(dbname)
for n, s := range servers {
db, err := s.DB()
require.NoError(t, err)
dbs[n] = db
}
for i, c := range test.Conns {
db := dbs[c.On]
require.NotNilf(t, db, "error in test spec: could not find database %s for connection %d", c.On, i)
@@ -268,12 +290,7 @@ func RunTestsFile(t *testing.T, path string) {
require.NotNilf(t, s, "error in test spec: could not find server %s for connection %d", c.On, i)
err := s.Restart(c.RestartServer.Args)
require.NoError(t, err)
dbname := c.On
_, ismultirepo := doltlocs[c.On].(RepoStore)
if ismultirepo {
dbname = ""
}
db, err := s.DB(dbname)
db, err := s.DB()
require.NoError(t, err)
dbs[c.On] = db
}

View File

@@ -40,10 +40,9 @@ tests:
bootstrap_epoch: 15
remotesapi:
port: 50051
servers:
- name: server1
args: ["--config", "standby_server.yaml"]
port: 3309
server:
args: ["--config", "standby_server.yaml"]
port: 3309
connections:
- on: server1
queries:
@@ -95,10 +94,9 @@ tests:
bootstrap_epoch: 10
remotesapi:
port: 50051
servers:
- name: server1
args: ["--config", "server.yaml"]
port: 3309
server:
args: ["--config", "server.yaml"]
port: 3309
connections:
- on: server1
queries:
@@ -173,10 +171,9 @@ tests:
bootstrap_epoch: 10
remotesapi:
port: 50051
servers:
- name: server1
args: ["--config", "server.yaml"]
port: 3309
server:
args: ["--config", "server.yaml"]
port: 3309
connections:
- on: server1
queries:
@@ -211,12 +208,11 @@ tests:
bootstrap_epoch: 10
remotesapi:
port: 50051
servers:
- name: server1
args: ["--config", "server.yaml"]
port: 3309
error_matches:
- destination remote standby does not exist
server:
args: ["--config", "server.yaml"]
port: 3309
error_matches:
- destination remote standby does not exist
- name: primary comes up and replicates to standby
multi_repos:
- name: server1
@@ -244,6 +240,9 @@ tests:
bootstrap_epoch: 10
remotesapi:
port: 50051
server:
args: ["--port", "3309"]
port: 3309
- name: server2
repos:
- name: repo1
@@ -269,13 +268,9 @@ tests:
bootstrap_epoch: 10
remotesapi:
port: 50052
servers:
- name: server1
args: ["--port", "3309"]
port: 3309
- name: server2
args: ["--config", "server.yaml"]
port: 3310
server:
args: ["--config", "server.yaml"]
port: 3310
connections:
- on: server1
queries:

View File

@@ -6,9 +6,8 @@ tests:
- name: ".dolt/config.json"
contents: |
{"sqlserver.global.max_connections":"1000"}
servers:
- name: repo1
args: ["-l", "trace"]
server:
args: ["-l", "trace"]
connections:
- on: repo1
queries:
@@ -23,11 +22,10 @@ tests:
- name: ".dolt/config.json"
contents: |
{"sqlserver.global.unknown":"1000"}
servers:
- name: repo1
args: ["-l", "trace"]
log_matches:
- "warning: persisted system variable unknown was not loaded since its definition does not exist."
server:
args: ["-l", "trace"]
log_matches:
- "warning: persisted system variable unknown was not loaded since its definition does not exist."
- name: invalid persisted global variable value throws warning on server startup, but does not crash
repos:
- name: repo1
@@ -35,16 +33,14 @@ tests:
- name: ".dolt/config.json"
contents: |
{"sqlserver.global.max_connections":"string"}
servers:
- name: repo1
log_matches:
- "error: failed to load persisted global variables: key: 'max_connections'; strconv.ParseInt: parsing \"string\": invalid syntax"
server:
log_matches:
- "error: failed to load persisted global variables: key: 'max_connections'; strconv.ParseInt: parsing \"string\": invalid syntax"
- name: persisted global variable in server
repos:
- name: repo1
servers:
- name: repo1
args: ["-l", "trace"]
server:
args: ["-l", "trace"]
connections:
- on: repo1
queries:
@@ -63,9 +59,8 @@ tests:
- name: dolt_replicate_heads is global variable
repos:
- name: repo1
servers:
- name: repo1
args: ["-l", "trace"]
server:
args: ["-l", "trace"]
connections:
- on: repo1
queries:
@@ -92,9 +87,8 @@ tests:
- name: dolt_replicate_all_heads is global variable
repos:
- name: repo1
servers:
- name: repo1
args: ["-l", "trace"]
server:
args: ["-l", "trace"]
connections:
- on: repo1
queries:
@@ -121,9 +115,8 @@ tests:
- name: dolt_transaction_commit is global variable
repos:
- name: repo1
servers:
- name: repo1
args: ["-l", "trace"]
server:
args: ["-l", "trace"]
connections:
- on: repo1
queries:
@@ -159,9 +152,8 @@ tests:
- name: persist only global variable during server session
repos:
- name: repo1
servers:
- name: repo1
args: ["-l", "trace"]
server:
args: ["-l", "trace"]
connections:
- on: repo1
queries:
@@ -181,9 +173,8 @@ tests:
- name: persist invalid global variable name during server session
repos:
- name: repo1
servers:
- name: repo1
args: ["-l", "trace"]
server:
args: ["-l", "trace"]
connections:
- on: repo1
queries:
@@ -192,8 +183,7 @@ tests:
- name: persist invalid global variable value during server session
repos:
- name: repo1
servers:
- name: repo1
server: {}
connections:
- on: repo1
queries:
@@ -208,9 +198,8 @@ tests:
log_level: trace
listener:
max_connections: 999
servers:
- name: repo1
args: ["--config", "server.yaml"]
server:
args: ["--config", "server.yaml"]
connections:
- on: repo1
queries:
@@ -221,9 +210,8 @@ tests:
- name: persistence behavior set to load
repos:
- name: repo1
servers:
- name: repo1
args: ["--persistence-behavior", "load"]
server:
args: ["--persistence-behavior", "load"]
connections:
- on: repo1
queries:
@@ -234,9 +222,8 @@ tests:
- name: persistence behavior set to ignore
repos:
- name: repo1
servers:
- name: repo1
args: ["--persistence-behavior", "ignore"]
server:
args: ["--persistence-behavior", "ignore"]
connections:
- on: repo1
queries:
@@ -247,9 +234,8 @@ tests:
- name: persisted global variable defined on the command line
repos:
- name: repo1
servers:
- name: repo1
args: ["--max-connections", "555"]
server:
args: ["--max-connections", "555"]
connections:
- on: repo1
queries:
@@ -264,9 +250,8 @@ tests:
- name: ".dolt/config.json"
contents: |
{"sqlserver.global.max_connections":"999"}
servers:
- name: repo1
args: ["--persistence-behavior", "ignore"]
server:
args: ["--persistence-behavior", "ignore"]
connections:
- on: repo1
queries:
@@ -277,9 +262,8 @@ tests:
- name: persisted global variable defined on the command line with persistence ignored
repos:
- name: repo1
servers:
- name: repo1
args: ["--max-connections", "555", "--persistence-behavior", "ignore"]
server:
args: ["--max-connections", "555", "--persistence-behavior", "ignore"]
connections:
- on: repo1
queries: