mirror of
https://github.com/dolthub/dolt.git
synced 2026-04-22 02:50:04 -05:00
Merge pull request #8997 from dolthub/aaron/go-integration-tests-parallel
[no-release-notes] integration-tests/go-sql-server-driver: Add dynamic port allocation and run these tests in parallel.
This commit is contained in:
@@ -129,6 +129,10 @@ type WithFile struct {
|
||||
// A source file path to copy to |Name|. Mutually exclusive with
|
||||
// Contents.
|
||||
SourcePath string `yaml:"source_path"`
|
||||
|
||||
// If this is non-nil, the template will be applied to the
|
||||
// contents of the file as they are written through |WriteAtDir|.
|
||||
Template func(string) string
|
||||
}
|
||||
|
||||
func (f WithFile) WriteAtDir(dir string) error {
|
||||
@@ -152,10 +156,22 @@ func (f WithFile) WriteAtDir(dir string) error {
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
_, err = io.Copy(dest, source)
|
||||
contents, err := io.ReadAll(source)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
if f.Template != nil {
|
||||
str := f.Template(string(contents))
|
||||
contents = []byte(str)
|
||||
}
|
||||
_, err = dest.Write(contents)
|
||||
return err
|
||||
} else {
|
||||
return os.WriteFile(path, []byte(f.Contents), 0550)
|
||||
contents := f.Contents
|
||||
if f.Template != nil {
|
||||
contents = f.Template(contents)
|
||||
}
|
||||
return os.WriteFile(path, []byte(contents), 0550)
|
||||
}
|
||||
}
|
||||
|
||||
@@ -167,9 +183,17 @@ type Server struct {
|
||||
Envs []string `yaml:"envs"`
|
||||
|
||||
// The |Port| which the server will be running on. For now, it is up to
|
||||
// the |Args| to make sure this is true. Defaults to 3308.
|
||||
// the |Args| to make sure this is true. Defaults to 3306.
|
||||
Port int `yaml:"port"`
|
||||
|
||||
// This can be used with templating of dynamic ports to
|
||||
// specify the SQL listener port which will have been filled
|
||||
// in by a call to `{{get_port "server_name"}}` within the
|
||||
// config or args of the server.
|
||||
//
|
||||
// A |Port| != 0 with a |DynamicPort| != "" is an error.
|
||||
DynamicPort string `yaml:"dynamic_port"`
|
||||
|
||||
// DebugPort if set to a non-zero value will cause this server to be started with |dlv| listening for a debugger
|
||||
// connection on the port given.
|
||||
DebugPort int `yaml:"debug_port"`
|
||||
@@ -192,7 +216,7 @@ type ExternalServer struct {
|
||||
User string `yaml:"user"`
|
||||
Password string `yaml:"password"`
|
||||
// The |Port| which the server will be running on. For now, it is up to
|
||||
// the |Args| to make sure this is true. Defaults to 3308.
|
||||
// the |Args| to make sure this is true. Defaults to 3306.
|
||||
Port int `yaml:"port"`
|
||||
}
|
||||
|
||||
|
||||
@@ -32,9 +32,12 @@ import (
|
||||
)
|
||||
|
||||
func TestAutoGC(t *testing.T) {
|
||||
t.Parallel()
|
||||
var enabled_16, final_16, disabled, final_disabled RepoSize
|
||||
t.Run("Enable", func(t *testing.T) {
|
||||
t.Parallel()
|
||||
t.Run("CommitEvery16", func(t *testing.T) {
|
||||
t.Parallel()
|
||||
var s AutoGCTest
|
||||
s.Enable = true
|
||||
enabled_16, final_16 = runAutoGCTest(t, &s, 64, 16)
|
||||
@@ -43,6 +46,7 @@ func TestAutoGC(t *testing.T) {
|
||||
t.Logf("repo size after final gc: %v", final_16)
|
||||
})
|
||||
t.Run("ClusterReplication", func(t *testing.T) {
|
||||
t.Parallel()
|
||||
var s AutoGCTest
|
||||
s.Enable = true
|
||||
s.Replicate = true
|
||||
@@ -57,6 +61,7 @@ func TestAutoGC(t *testing.T) {
|
||||
})
|
||||
})
|
||||
t.Run("Disabled", func(t *testing.T) {
|
||||
t.Parallel()
|
||||
var s AutoGCTest
|
||||
disabled, final_disabled = runAutoGCTest(t, &s, 64, 128)
|
||||
assert.NotContains(t, string(s.PrimaryServer.Output.Bytes()), "Successfully completed auto GC")
|
||||
@@ -80,9 +85,15 @@ type AutoGCTest struct {
|
||||
StandbyDir string
|
||||
StandbyServer *driver.SqlServer
|
||||
StandbyDB *sql.DB
|
||||
|
||||
Ports *DynamicPorts
|
||||
}
|
||||
|
||||
func (s *AutoGCTest) Setup(ctx context.Context, t *testing.T) {
|
||||
s.Ports = &DynamicPorts{
|
||||
global: &GlobalPorts,
|
||||
t: t,
|
||||
}
|
||||
u, err := driver.NewDoltUser()
|
||||
require.NoError(t, err)
|
||||
t.Cleanup(func() {
|
||||
@@ -114,6 +125,8 @@ func (s *AutoGCTest) CreatePrimaryServer(ctx context.Context, t *testing.T, u dr
|
||||
behavior:
|
||||
auto_gc_behavior:
|
||||
enable: %v
|
||||
listener:
|
||||
port: {{get_port "primary_server_port"}}
|
||||
`, s.Enable)
|
||||
|
||||
var clusterFragment string
|
||||
@@ -122,23 +135,25 @@ behavior:
|
||||
cluster:
|
||||
standby_remotes:
|
||||
- name: standby
|
||||
remote_url_template: http://localhost:3852/{database}
|
||||
remote_url_template: http://localhost:{{get_port "standby_server_cluster_port"}}/{database}
|
||||
bootstrap_role: primary
|
||||
bootstrap_epoch: 1
|
||||
remotesapi:
|
||||
port: 3851
|
||||
port: {{get_port "primary_server_cluster_port"}}
|
||||
`
|
||||
}
|
||||
|
||||
err = driver.WithFile{
|
||||
Name: "server.yaml",
|
||||
Contents: behaviorFragment + clusterFragment,
|
||||
Template: s.Ports.ApplyTemplate,
|
||||
}.WriteAtDir(repo.Dir)
|
||||
require.NoError(t, err)
|
||||
|
||||
server := MakeServer(t, repo, &driver.Server{
|
||||
Args: []string{"--config", "server.yaml"},
|
||||
})
|
||||
Args: []string{"--config", "server.yaml"},
|
||||
DynamicPort: "primary_server_port",
|
||||
}, s.Ports)
|
||||
server.DBName = "auto_gc_test"
|
||||
|
||||
db, err := server.DB(driver.Connection{User: "root"})
|
||||
@@ -162,7 +177,7 @@ func (s *AutoGCTest) CreateStandbyServer(ctx context.Context, t *testing.T, u dr
|
||||
behaviorFragment := fmt.Sprintf(`
|
||||
listener:
|
||||
host: 0.0.0.0
|
||||
port: 3308
|
||||
port: {{get_port "standby_server_port"}}
|
||||
behavior:
|
||||
auto_gc_behavior:
|
||||
enable: %v
|
||||
@@ -174,24 +189,25 @@ behavior:
|
||||
cluster:
|
||||
standby_remotes:
|
||||
- name: primary
|
||||
remote_url_template: http://localhost:3851/{database}
|
||||
remote_url_template: http://localhost:{{get_port "primary_server_cluster_port"}}/{database}
|
||||
bootstrap_role: standby
|
||||
bootstrap_epoch: 1
|
||||
remotesapi:
|
||||
port: 3852
|
||||
port: {{get_port "standby_server_cluster_port"}}
|
||||
`
|
||||
}
|
||||
|
||||
err = driver.WithFile{
|
||||
Name: "server.yaml",
|
||||
Contents: behaviorFragment + clusterFragment,
|
||||
Template: s.Ports.ApplyTemplate,
|
||||
}.WriteAtDir(repo.Dir)
|
||||
require.NoError(t, err)
|
||||
|
||||
server := MakeServer(t, repo, &driver.Server{
|
||||
Args: []string{"--config", "server.yaml"},
|
||||
Port: 3308,
|
||||
})
|
||||
Args: []string{"--config", "server.yaml"},
|
||||
DynamicPort: "standby_server_port",
|
||||
}, s.Ports)
|
||||
server.DBName = "auto_gc_test"
|
||||
|
||||
db, err := server.DB(driver.Connection{User: "root"})
|
||||
|
||||
@@ -31,13 +31,14 @@ import (
|
||||
)
|
||||
|
||||
func TestConcurrentGC(t *testing.T) {
|
||||
t.Parallel()
|
||||
type dimension struct {
|
||||
names []string
|
||||
factors func(gcTest) []gcTest
|
||||
}
|
||||
commits := dimension{
|
||||
names: []string{"NoCommits", "WithCommits"},
|
||||
factors: func(base gcTest) []gcTest{
|
||||
factors: func(base gcTest) []gcTest {
|
||||
no, yes := base, base
|
||||
no.commit = false
|
||||
yes.commit = true
|
||||
@@ -46,16 +47,16 @@ func TestConcurrentGC(t *testing.T) {
|
||||
}
|
||||
full := dimension{
|
||||
names: []string{"NotFull", "Full"},
|
||||
factors: func(base gcTest) []gcTest{
|
||||
factors: func(base gcTest) []gcTest {
|
||||
no, yes := base, base
|
||||
no.full = false
|
||||
yes.full = true
|
||||
return []gcTest{no, yes}
|
||||
},
|
||||
}
|
||||
safepoint := dimension {
|
||||
safepoint := dimension{
|
||||
names: []string{"KillConnections", "SessionAware"},
|
||||
factors: func(base gcTest) []gcTest{
|
||||
factors: func(base gcTest) []gcTest {
|
||||
no, yes := base, base
|
||||
no.sessionAware = false
|
||||
yes.sessionAware = true
|
||||
@@ -63,7 +64,7 @@ func TestConcurrentGC(t *testing.T) {
|
||||
},
|
||||
}
|
||||
var doDimensions func(t *testing.T, base gcTest, dims []dimension)
|
||||
doDimensions = func (t *testing.T, base gcTest, dims []dimension) {
|
||||
doDimensions = func(t *testing.T, base gcTest, dims []dimension) {
|
||||
if len(dims) == 0 {
|
||||
base.run(t)
|
||||
return
|
||||
@@ -72,6 +73,7 @@ func TestConcurrentGC(t *testing.T) {
|
||||
dimf := dim.factors(base)
|
||||
for i := range dim.names {
|
||||
t.Run(dim.names[i], func(t *testing.T) {
|
||||
t.Parallel()
|
||||
doDimensions(t, dimf[i], dims)
|
||||
})
|
||||
}
|
||||
@@ -109,6 +111,21 @@ func (gct gcTest) createDB(t *testing.T, ctx context.Context, db *sql.DB) {
|
||||
require.NoError(t, err)
|
||||
}
|
||||
|
||||
// When running with kill_connections GC safepoints, asserts that the
|
||||
// error we got is not an error that was not allowed.
|
||||
func assertExpectedGCError(t *testing.T, err error) bool {
|
||||
if !assert.NotContains(t, err.Error(), "dangling ref") {
|
||||
return false
|
||||
}
|
||||
if !assert.NotContains(t, err.Error(), "is unexpected noms value") {
|
||||
return false
|
||||
}
|
||||
if !assert.NotContains(t, err.Error(), "interface conversion: types.Value is nil") {
|
||||
return false
|
||||
}
|
||||
return true
|
||||
}
|
||||
|
||||
func (gct gcTest) doUpdate(t *testing.T, ctx context.Context, db *sql.DB, i int) error {
|
||||
conn, err := db.Conn(ctx)
|
||||
if gct.sessionAware {
|
||||
@@ -121,37 +138,51 @@ func (gct gcTest) doUpdate(t *testing.T, ctx context.Context, db *sql.DB, i int)
|
||||
return nil
|
||||
}
|
||||
defer conn.Close()
|
||||
_, err = conn.ExecContext(ctx, "update vals set val = val+1 where id = ?", i)
|
||||
|
||||
tx, err := conn.BeginTx(ctx, nil)
|
||||
if gct.sessionAware {
|
||||
assert.NoError(t, err)
|
||||
}
|
||||
if err != nil {
|
||||
// Ignore and try with a different connection...
|
||||
return nil
|
||||
}
|
||||
defer tx.Rollback()
|
||||
_, err = tx.ExecContext(ctx, "update vals set val = val+1 where id = ?", i)
|
||||
if gct.sessionAware {
|
||||
assert.NoError(t, err)
|
||||
} else if err != nil {
|
||||
if !assert.NotContains(t, err.Error(), "dangling ref") {
|
||||
return err
|
||||
}
|
||||
if !assert.NotContains(t, err.Error(), "is unexpected noms value") {
|
||||
return err
|
||||
}
|
||||
if !assert.NotContains(t, err.Error(), "interface conversion: types.Value is nil") {
|
||||
if !assertExpectedGCError(t, err) {
|
||||
return err
|
||||
}
|
||||
t.Logf("err in Exec update: %v", err)
|
||||
}
|
||||
if err != nil {
|
||||
// Early return so we do not try to continue using the
|
||||
// broken connection or attempt to commit something
|
||||
// with no changes.
|
||||
return nil
|
||||
}
|
||||
if gct.commit {
|
||||
_, err = conn.ExecContext(ctx, fmt.Sprintf("call dolt_commit('-am', 'increment vals id = %d')", i))
|
||||
_, err = tx.ExecContext(ctx, fmt.Sprintf("call dolt_commit('-am', 'increment vals id = %d')", i))
|
||||
if gct.sessionAware {
|
||||
assert.NoError(t, err)
|
||||
} else if err != nil {
|
||||
if !assert.NotContains(t, err.Error(), "dangling ref") {
|
||||
return err
|
||||
}
|
||||
if !assert.NotContains(t, err.Error(), "is unexpected noms value") {
|
||||
return err
|
||||
}
|
||||
if !assert.NotContains(t, err.Error(), "interface conversion: types.Value is nil") {
|
||||
if !assertExpectedGCError(t, err) {
|
||||
return err
|
||||
}
|
||||
t.Logf("err in Exec call dolt_commit: %v", err)
|
||||
}
|
||||
} else {
|
||||
err = tx.Commit()
|
||||
if gct.sessionAware {
|
||||
assert.NoError(t, err)
|
||||
} else if err != nil {
|
||||
if !assertExpectedGCError(t, err) {
|
||||
return err
|
||||
}
|
||||
t.Logf("err in tx commit: %v", err)
|
||||
}
|
||||
}
|
||||
return nil
|
||||
}
|
||||
@@ -225,6 +256,9 @@ func (gct gcTest) finalize(t *testing.T, ctx context.Context, db *sql.DB) {
|
||||
}
|
||||
|
||||
func (gct gcTest) run(t *testing.T) {
|
||||
var ports DynamicPorts
|
||||
ports.global = &GlobalPorts
|
||||
ports.t = t
|
||||
u, err := driver.NewDoltUser()
|
||||
require.NoError(t, err)
|
||||
t.Cleanup(func() {
|
||||
@@ -237,14 +271,17 @@ func (gct gcTest) run(t *testing.T) {
|
||||
repo, err := rs.MakeRepo("concurrent_gc_test")
|
||||
require.NoError(t, err)
|
||||
|
||||
srvSettings := &driver.Server{}
|
||||
srvSettings := &driver.Server{
|
||||
Args: []string{"-P", `{{get_port "server_port"}}`},
|
||||
DynamicPort: "server_port",
|
||||
}
|
||||
if gct.sessionAware {
|
||||
srvSettings.Envs = append(srvSettings.Envs, "DOLT_GC_SAFEPOINT_CONTROLLER_CHOICE=session_aware")
|
||||
} else {
|
||||
srvSettings.Envs = append(srvSettings.Envs, "DOLT_GC_SAFEPOINT_CONTROLLER_CHOICE=kill_connections")
|
||||
}
|
||||
|
||||
server := MakeServer(t, repo, srvSettings)
|
||||
server := MakeServer(t, repo, srvSettings, &ports)
|
||||
server.DBName = "concurrent_gc_test"
|
||||
|
||||
db, err := server.DB(driver.Connection{User: "root"})
|
||||
|
||||
@@ -29,6 +29,10 @@ import (
|
||||
)
|
||||
|
||||
func TestGCConjoinsOldgen(t *testing.T) {
|
||||
t.Parallel()
|
||||
var ports DynamicPorts
|
||||
ports.global = &GlobalPorts
|
||||
ports.t = t
|
||||
u, err := driver.NewDoltUser()
|
||||
require.NoError(t, err)
|
||||
t.Cleanup(func() {
|
||||
@@ -41,7 +45,10 @@ func TestGCConjoinsOldgen(t *testing.T) {
|
||||
repo, err := rs.MakeRepo("concurrent_gc_test")
|
||||
require.NoError(t, err)
|
||||
|
||||
server := MakeServer(t, repo, &driver.Server{})
|
||||
server := MakeServer(t, repo, &driver.Server{
|
||||
Args: []string{"--port", `{{get_port "server"}}`},
|
||||
DynamicPort: "server",
|
||||
}, &ports)
|
||||
server.DBName = "concurrent_gc_test"
|
||||
|
||||
db, err := server.DB(driver.Connection{User: "root"})
|
||||
|
||||
@@ -20,7 +20,7 @@ import (
|
||||
"crypto/rsa"
|
||||
"encoding/json"
|
||||
"fmt"
|
||||
"io/ioutil"
|
||||
"os"
|
||||
"path/filepath"
|
||||
"time"
|
||||
|
||||
@@ -61,7 +61,7 @@ func GenerateTestJWTs(dir string) error {
|
||||
return fmt.Errorf("could not generate jwt: %w", err)
|
||||
}
|
||||
|
||||
err = ioutil.WriteFile(filepath.Join(dir, "token.jwt"), []byte(jwt), 0644)
|
||||
err = os.WriteFile(filepath.Join(dir, "token.jwt"), []byte(jwt), 0644)
|
||||
if err != nil {
|
||||
return fmt.Errorf("could not write jwt to file: %w", err)
|
||||
}
|
||||
@@ -82,7 +82,7 @@ func writeJWKSToFile(dir string, pubKey crypto.PublicKey, kid string) error {
|
||||
return err
|
||||
}
|
||||
|
||||
err = ioutil.WriteFile(filepath.Join(dir, "test_jwks.json"), jwksjson, 0644)
|
||||
err = os.WriteFile(filepath.Join(dir, "test_jwks.json"), jwksjson, 0644)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
@@ -49,26 +49,41 @@ func TestMain(m *testing.M) {
|
||||
}
|
||||
os.Setenv("TESTGENDIR", gendir)
|
||||
flag.Parse()
|
||||
InitGlobalDynamicPorts()
|
||||
os.Exit(m.Run())
|
||||
}
|
||||
|
||||
func InitGlobalDynamicPorts() {
|
||||
// XXX: Max and min here could be supplied by flags. Currently
|
||||
// tests use at most 6 ports, so this may run out of ports if
|
||||
// we have more than ~40 concurrent processes.
|
||||
for i := 0; i < 256; i++ {
|
||||
GlobalPorts.available = append(GlobalPorts.available, 3306 + i)
|
||||
}
|
||||
}
|
||||
|
||||
func TestConfig(t *testing.T) {
|
||||
t.Parallel()
|
||||
RunTestsFile(t, "tests/sql-server-config.yaml")
|
||||
}
|
||||
|
||||
func TestJWTAuth(t *testing.T) {
|
||||
t.Parallel()
|
||||
RunTestsFile(t, "tests/sql-server-jwt-auth.yaml")
|
||||
}
|
||||
|
||||
func TestCluster(t *testing.T) {
|
||||
t.Parallel()
|
||||
RunTestsFile(t, "tests/sql-server-cluster.yaml")
|
||||
}
|
||||
|
||||
func TestClusterUsersAndGrants(t *testing.T) {
|
||||
t.Parallel()
|
||||
RunTestsFile(t, "tests/sql-server-cluster-users-and-grants.yaml")
|
||||
}
|
||||
|
||||
func TestRemotesAPI(t *testing.T) {
|
||||
t.Parallel()
|
||||
RunTestsFile(t, "tests/sql-server-remotesapi.yaml")
|
||||
}
|
||||
|
||||
@@ -80,17 +95,21 @@ func TestSingle(t *testing.T) {
|
||||
}
|
||||
|
||||
func TestClusterTLS(t *testing.T) {
|
||||
t.Parallel()
|
||||
RunTestsFile(t, "tests/sql-server-cluster-tls.yaml")
|
||||
}
|
||||
|
||||
func TestOriginal(t *testing.T) {
|
||||
t.Parallel()
|
||||
RunTestsFile(t, "tests/sql-server-orig.yaml")
|
||||
}
|
||||
|
||||
func TestTLS(t *testing.T) {
|
||||
t.Parallel()
|
||||
RunTestsFile(t, "tests/sql-server-tls.yaml")
|
||||
}
|
||||
|
||||
func TestClusterReadOnly(t *testing.T) {
|
||||
t.Parallel()
|
||||
RunTestsFile(t, "tests/sql-server-cluster-read-only.yaml")
|
||||
}
|
||||
|
||||
@@ -29,6 +29,7 @@ import (
|
||||
)
|
||||
|
||||
func TestSQLServerInfoFile(t *testing.T) {
|
||||
t.Parallel()
|
||||
t.Run("With Two Repos", func(t *testing.T) {
|
||||
u, err := driver.NewDoltUser()
|
||||
require.NoError(t, err)
|
||||
@@ -44,7 +45,13 @@ func TestSQLServerInfoFile(t *testing.T) {
|
||||
require.NoError(t, err)
|
||||
|
||||
t.Run("With server running in root", func(t *testing.T) {
|
||||
RunServerUntilEndOfTest(t, rs, &driver.Server{})
|
||||
var ports DynamicPorts
|
||||
ports.global = &GlobalPorts
|
||||
ports.t = t
|
||||
RunServerUntilEndOfTest(t, rs, &driver.Server{
|
||||
Args: []string{"--port", `{{get_port "server_one"}}`},
|
||||
DynamicPort: "server_one",
|
||||
}, &ports)
|
||||
|
||||
t.Run("sql-server.info file exists", func(t *testing.T) {
|
||||
location := filepath.Join(rs.Dir, ".dolt/sql-server.info")
|
||||
@@ -54,17 +61,21 @@ func TestSQLServerInfoFile(t *testing.T) {
|
||||
})
|
||||
t.Run("Running again in root fails", func(t *testing.T) {
|
||||
_ = MakeServer(t, rs, &driver.Server{
|
||||
Args: []string{"--port", `{{get_port "server_two"}}`},
|
||||
DynamicPort: "server_two",
|
||||
ErrorMatches: []string{
|
||||
"locked by another dolt process",
|
||||
},
|
||||
})
|
||||
}, &ports)
|
||||
})
|
||||
t.Run("Running in db_one fails", func(t *testing.T) {
|
||||
_ = MakeServer(t, dbOne, &driver.Server{
|
||||
Args: []string{"--port", `{{get_port "server_two"}}`},
|
||||
DynamicPort: "server_two",
|
||||
ErrorMatches: []string{
|
||||
"locked by another dolt process",
|
||||
},
|
||||
})
|
||||
}, &ports)
|
||||
})
|
||||
t.Run("Running dolt sql -q in /server connects to server", func(t *testing.T) {
|
||||
cmd := rs.DoltCmd("sql", "-q", "show databases")
|
||||
@@ -107,20 +118,28 @@ func TestSQLServerInfoFile(t *testing.T) {
|
||||
require.ErrorIs(t, err, fs.ErrNotExist)
|
||||
})
|
||||
t.Run("With server running in db_one", func(t *testing.T) {
|
||||
RunServerUntilEndOfTest(t, dbOne, &driver.Server{})
|
||||
var ports DynamicPorts
|
||||
ports.global = &GlobalPorts
|
||||
ports.t = t
|
||||
RunServerUntilEndOfTest(t, dbOne, &driver.Server{
|
||||
Args: []string{"--port", `{{get_port "server_one"}}`},
|
||||
DynamicPort: "server_one",
|
||||
}, &ports)
|
||||
|
||||
t.Run("Running server in root fails", func(t *testing.T) {
|
||||
_ = MakeServer(t, rs, &driver.Server{
|
||||
Args: []string{"--port", `{{get_port "server_two"}}`},
|
||||
DynamicPort: "server_two",
|
||||
ErrorMatches: []string{
|
||||
"locked by another dolt process",
|
||||
},
|
||||
})
|
||||
}, &ports)
|
||||
})
|
||||
t.Run("Running server in db_two succeeds", func(t *testing.T) {
|
||||
RunServerUntilEndOfTest(t, dbTwo, &driver.Server{
|
||||
Args: []string{"--port", "3310"},
|
||||
Port: 3310,
|
||||
})
|
||||
Args: []string{"--port", `{{get_port "server_two"}}`},
|
||||
DynamicPort: "server_two",
|
||||
}, &ports)
|
||||
})
|
||||
t.Run("dolt sql -q in root succeeds", func(t *testing.T) {
|
||||
cmd := rs.DoltCmd("sql", "-q", "show databases")
|
||||
@@ -142,21 +161,28 @@ func TestSQLServerInfoFile(t *testing.T) {
|
||||
})
|
||||
})
|
||||
t.Run("Given a running dolt sql process in root", func(t *testing.T) {
|
||||
var ports DynamicPorts
|
||||
ports.global = &GlobalPorts
|
||||
ports.t = t
|
||||
RunDoltSQLUntilEndOfTest(t, rs)
|
||||
|
||||
t.Run("Running server in root fails", func(t *testing.T) {
|
||||
_ = MakeServer(t, rs, &driver.Server{
|
||||
Args: []string{"--port", `{{get_port "server_two"}}`},
|
||||
DynamicPort: "server_two",
|
||||
ErrorMatches: []string{
|
||||
"locked by another dolt process",
|
||||
},
|
||||
})
|
||||
}, &ports)
|
||||
})
|
||||
t.Run("Running server in db_one fails", func(t *testing.T) {
|
||||
_ = MakeServer(t, dbOne, &driver.Server{
|
||||
Args: []string{"--port", `{{get_port "server_two"}}`},
|
||||
DynamicPort: "server_two",
|
||||
ErrorMatches: []string{
|
||||
"locked by another dolt process",
|
||||
},
|
||||
})
|
||||
}, &ports)
|
||||
})
|
||||
t.Run("dolt sql -q in root succeeds", func(t *testing.T) {
|
||||
cmd := rs.DoltCmd("sql", "-q", "show databases")
|
||||
@@ -173,24 +199,34 @@ func TestSQLServerInfoFile(t *testing.T) {
|
||||
})
|
||||
})
|
||||
t.Run("Given a running dolt sql process in db_one", func(t *testing.T) {
|
||||
var ports DynamicPorts
|
||||
ports.global = &GlobalPorts
|
||||
ports.t = t
|
||||
RunDoltSQLUntilEndOfTest(t, dbOne)
|
||||
|
||||
t.Run("Running server in root fails", func(t *testing.T) {
|
||||
_ = MakeServer(t, rs, &driver.Server{
|
||||
Args: []string{"--port", `{{get_port "server_two"}}`},
|
||||
DynamicPort: "server_two",
|
||||
ErrorMatches: []string{
|
||||
"locked by another dolt process",
|
||||
},
|
||||
})
|
||||
}, &ports)
|
||||
})
|
||||
t.Run("Running server in db_one fails", func(t *testing.T) {
|
||||
_ = MakeServer(t, dbOne, &driver.Server{
|
||||
Args: []string{"--port", `{{get_port "server_two"}}`},
|
||||
DynamicPort: "server_two",
|
||||
ErrorMatches: []string{
|
||||
"locked by another dolt process",
|
||||
},
|
||||
})
|
||||
}, &ports)
|
||||
})
|
||||
t.Run("Running server in db_two succeeds", func(t *testing.T) {
|
||||
RunServerUntilEndOfTest(t, dbTwo, &driver.Server{})
|
||||
RunServerUntilEndOfTest(t, dbTwo, &driver.Server{
|
||||
Args: []string{"--port", `{{get_port "server_two"}}`},
|
||||
DynamicPort: "server_two",
|
||||
}, &ports)
|
||||
})
|
||||
t.Run("dolt sql -q in root succeeds", func(t *testing.T) {
|
||||
cmd := rs.DoltCmd("sql", "-q", "show databases")
|
||||
@@ -212,6 +248,9 @@ func TestSQLServerInfoFile(t *testing.T) {
|
||||
})
|
||||
})
|
||||
t.Run("With stale sql-server.info file in root", func(t *testing.T) {
|
||||
var ports DynamicPorts
|
||||
ports.global = &GlobalPorts
|
||||
ports.t = t
|
||||
Setup := func(t *testing.T) {
|
||||
path := filepath.Join(rs.Dir, ".dolt/sql-server.info")
|
||||
err := os.WriteFile(path, []byte("1:3306:this_is_not_a_real_secret"), 0600)
|
||||
@@ -220,11 +259,17 @@ func TestSQLServerInfoFile(t *testing.T) {
|
||||
}
|
||||
t.Run("sql-server can run in root", func(t *testing.T) {
|
||||
Setup(t)
|
||||
RunServerUntilEndOfTest(t, rs, &driver.Server{})
|
||||
RunServerUntilEndOfTest(t, rs, &driver.Server{
|
||||
Args: []string{"--port", `{{get_port "server_one"}}`},
|
||||
DynamicPort: "server_one",
|
||||
}, &ports)
|
||||
})
|
||||
t.Run("sql-server can run in db_one", func(t *testing.T) {
|
||||
Setup(t)
|
||||
RunServerUntilEndOfTest(t, dbOne, &driver.Server{})
|
||||
RunServerUntilEndOfTest(t, dbOne, &driver.Server{
|
||||
Args: []string{"--port", `{{get_port "server_one"}}`},
|
||||
DynamicPort: "server_one",
|
||||
}, &ports)
|
||||
})
|
||||
t.Run("sql can run in root", func(t *testing.T) {
|
||||
Setup(t)
|
||||
@@ -245,6 +290,9 @@ func TestSQLServerInfoFile(t *testing.T) {
|
||||
})
|
||||
})
|
||||
t.Run("With malformed sql-server.info file in root", func(t *testing.T) {
|
||||
var ports DynamicPorts
|
||||
ports.global = &GlobalPorts
|
||||
ports.t = t
|
||||
Setup := func(t *testing.T) {
|
||||
path := filepath.Join(rs.Dir, ".dolt/sql-server.info")
|
||||
err := os.WriteFile(path, []byte("1:3306:this_is_not_a_real_secret:extra:fields:make:it:fail"), 0600)
|
||||
@@ -253,11 +301,17 @@ func TestSQLServerInfoFile(t *testing.T) {
|
||||
}
|
||||
t.Run("sql-server can run in root", func(t *testing.T) {
|
||||
Setup(t)
|
||||
RunServerUntilEndOfTest(t, rs, &driver.Server{})
|
||||
RunServerUntilEndOfTest(t, rs, &driver.Server{
|
||||
Args: []string{"--port", `{{get_port "server_one"}}`},
|
||||
DynamicPort: "server_one",
|
||||
}, &ports)
|
||||
})
|
||||
t.Run("sql-server can run in db_one", func(t *testing.T) {
|
||||
Setup(t)
|
||||
RunServerUntilEndOfTest(t, rs, &driver.Server{})
|
||||
RunServerUntilEndOfTest(t, rs, &driver.Server{
|
||||
Args: []string{"--port", `{{get_port "server_one"}}`},
|
||||
DynamicPort: "server_one",
|
||||
}, &ports)
|
||||
})
|
||||
t.Run("sql can run in root", func(t *testing.T) {
|
||||
Setup(t)
|
||||
@@ -312,11 +366,17 @@ func TestSQLServerInfoFile(t *testing.T) {
|
||||
// started, they can both run against it. Only one of their
|
||||
// credential files will win the write.
|
||||
t.Run("Can Run Two Servers At Once", func(t *testing.T) {
|
||||
RunServerUntilEndOfTest(t, rs, &driver.Server{})
|
||||
var ports DynamicPorts
|
||||
ports.global = &GlobalPorts
|
||||
ports.t = t
|
||||
RunServerUntilEndOfTest(t, rs, &driver.Server{
|
||||
Args: []string{"--port", "3309"},
|
||||
Port: 3309,
|
||||
})
|
||||
Args: []string{"--port", `{{get_port "server_one"}}`},
|
||||
DynamicPort: "server_one",
|
||||
}, &ports)
|
||||
RunServerUntilEndOfTest(t, rs, &driver.Server{
|
||||
Args: []string{"--port", `{{get_port "server_two"}}`},
|
||||
DynamicPort: "server_two",
|
||||
}, &ports)
|
||||
})
|
||||
})
|
||||
}
|
||||
@@ -359,8 +419,8 @@ func RunDoltSQLUntilEndOfTest(t *testing.T, dc driver.DoltCmdable) {
|
||||
// for doing things like making connections to it, this is only useful for
|
||||
// for asserting the behavior of other dolt commands which interact with the
|
||||
// server.
|
||||
func RunServerUntilEndOfTest(t *testing.T, dc driver.DoltCmdable, s *driver.Server) {
|
||||
server := MakeServer(t, dc, s)
|
||||
func RunServerUntilEndOfTest(t *testing.T, dc driver.DoltCmdable, s *driver.Server, ports *DynamicPorts) {
|
||||
server := MakeServer(t, dc, s, ports)
|
||||
require.NotNil(t, server)
|
||||
db, err := server.DB(driver.Connection{User: "root"})
|
||||
require.NoError(t, err)
|
||||
|
||||
@@ -18,29 +18,36 @@ import (
|
||||
"bytes"
|
||||
"context"
|
||||
"os"
|
||||
"sync"
|
||||
"testing"
|
||||
"text/template"
|
||||
"time"
|
||||
|
||||
"database/sql"
|
||||
|
||||
|
||||
driver "github.com/dolthub/dolt/go/libraries/doltcore/dtestutils/sql_server_driver"
|
||||
"github.com/stretchr/testify/assert"
|
||||
"github.com/stretchr/testify/require"
|
||||
yaml "gopkg.in/yaml.v3"
|
||||
)
|
||||
|
||||
var GlobalPorts GlobalDynamicPorts
|
||||
|
||||
type TestDef struct {
|
||||
Tests []Test `yaml:"tests"`
|
||||
|
||||
// If true, RunTestfile will run each subtest in parallel.
|
||||
Parallel bool `yaml:"parallel"`
|
||||
}
|
||||
|
||||
// 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 []driver.TestRepo `yaml:"repos"`
|
||||
MultiRepos []driver.MultiRepo `yaml:"multi_repos"`
|
||||
Conns []driver.Connection `yaml:"connections"`
|
||||
Name string `yaml:"name"`
|
||||
Repos []driver.TestRepo `yaml:"repos"`
|
||||
MultiRepos []driver.MultiRepo `yaml:"multi_repos"`
|
||||
Conns []driver.Connection `yaml:"connections"`
|
||||
|
||||
// Skip the entire test with this reason.
|
||||
Skip string `yaml:"skip"`
|
||||
@@ -48,6 +55,7 @@ type Test struct {
|
||||
|
||||
// Set this environment variable to effectively disable timeouts for debugging.
|
||||
const debugEnvKey = "DOLT_SQL_SERVER_TEST_DEBUG"
|
||||
|
||||
var timeout = 20 * time.Second
|
||||
|
||||
func init() {
|
||||
@@ -69,35 +77,160 @@ func ParseTestsFile(path string) (TestDef, error) {
|
||||
return res, err
|
||||
}
|
||||
|
||||
func MakeRepo(t *testing.T, rs driver.RepoStore, r driver.TestRepo) driver.Repo {
|
||||
func MakeRepo(t *testing.T, rs driver.RepoStore, r driver.TestRepo, ports *DynamicPorts) driver.Repo {
|
||||
repo, err := rs.MakeRepo(r.Name)
|
||||
require.NoError(t, err)
|
||||
for _, f := range r.WithFiles {
|
||||
f.Template = func(s string) string {
|
||||
return ports.ApplyTemplate(s)
|
||||
}
|
||||
require.NoError(t, f.WriteAtDir(repo.Dir))
|
||||
}
|
||||
for _, remote := range r.WithRemotes {
|
||||
require.NoError(t, repo.CreateRemote(remote.Name, remote.URL))
|
||||
url := remote.URL
|
||||
url = ports.ApplyTemplate(url)
|
||||
require.NoError(t, repo.CreateRemote(remote.Name, url))
|
||||
}
|
||||
return repo
|
||||
}
|
||||
|
||||
func MakeServer(t *testing.T, dc driver.DoltCmdable, s *driver.Server) *driver.SqlServer {
|
||||
// Simple interface for wrapping *testing.T. Used for retryingT.
|
||||
type TestingT interface {
|
||||
Fatal(...any)
|
||||
|
||||
FailNow()
|
||||
|
||||
Errorf(string, ...any)
|
||||
|
||||
Cleanup(func())
|
||||
}
|
||||
|
||||
// Globally available dynamic ports, backs every instance of
|
||||
// DynamicPorts and hands them out in a thread-safe manner.
|
||||
//
|
||||
// XXX: This structure and its initialization does not currently look
|
||||
// for "available" ports on the running host. It simply avoids handing
|
||||
// out the same port to two separate tests that are running at the
|
||||
// same time. It recycles ports as tests complete.
|
||||
type GlobalDynamicPorts struct {
|
||||
mu sync.Mutex
|
||||
available []int
|
||||
}
|
||||
|
||||
func (g *GlobalDynamicPorts) Get(t TestingT) int {
|
||||
g.mu.Lock()
|
||||
defer g.mu.Unlock()
|
||||
if len(g.available) == 0 {
|
||||
t.Fatal("cannot get a port; we are all out.")
|
||||
}
|
||||
next := g.available[len(g.available)-1]
|
||||
g.available = g.available[:len(g.available)-1]
|
||||
return next
|
||||
}
|
||||
|
||||
func (g *GlobalDynamicPorts) Return(n int) {
|
||||
g.mu.Lock()
|
||||
defer g.mu.Unlock()
|
||||
g.available = append(g.available, n)
|
||||
}
|
||||
|
||||
// Tracks dynamic ports available for expansion in `{{get_port ...}}`
|
||||
// templates for server args and config files.
|
||||
type DynamicPorts struct {
|
||||
// Where we go when we need a new one.
|
||||
global *GlobalDynamicPorts
|
||||
|
||||
t TestingT
|
||||
|
||||
// Where we put allocated ports. For a given test, the first
|
||||
// use will get a new unused port from
|
||||
// GlobalDynamicPorts. Then that same port will be returned
|
||||
// from here for all uses. When the test finishes, its Cleanup
|
||||
// returns the port to GlobalDynamicPorts.
|
||||
allocated map[string]int
|
||||
}
|
||||
|
||||
func (d *DynamicPorts) Get(name string) (int, bool) {
|
||||
if d.allocated != nil {
|
||||
v, ok := d.allocated[name]
|
||||
return v, ok
|
||||
} else {
|
||||
return 0, false
|
||||
}
|
||||
}
|
||||
|
||||
func (d *DynamicPorts) GetOrAllocate(name string) int {
|
||||
v, ok := d.Get(name)
|
||||
if ok {
|
||||
return v
|
||||
}
|
||||
v = d.global.Get(d.t)
|
||||
if d.allocated == nil {
|
||||
d.allocated = make(map[string]int)
|
||||
// We register one cleanup function for the entire
|
||||
// DynamicPorts and we return them all at once.
|
||||
//
|
||||
// In cases where there are two dependent servers, we
|
||||
// want to return all ports after both servers have
|
||||
// been shut down. If we return them as we allocated
|
||||
// them, it's possible that we allocated them to
|
||||
// render the entire config for the first server, some
|
||||
// referring to the second server, for example. If
|
||||
// testing.T runs cleanups in FIFO order, and the
|
||||
// Cleanup for running the second server is
|
||||
// responsible for shutting it down, it is possible we
|
||||
// would return the second server's ports before it is
|
||||
// shut down if we didn't return them all at once.
|
||||
d.t.Cleanup(func() {
|
||||
for _, p := range d.allocated {
|
||||
d.global.Return(p)
|
||||
}
|
||||
})
|
||||
}
|
||||
d.allocated[name] = v
|
||||
return v
|
||||
}
|
||||
|
||||
func (d *DynamicPorts) ApplyTemplate(s string) string {
|
||||
tmpl, err := template.New("sql").Funcs(map[string]any{
|
||||
"get_port": d.GetOrAllocate,
|
||||
}).Parse(s)
|
||||
require.NoError(d.t, err)
|
||||
var buf bytes.Buffer
|
||||
err = tmpl.Execute(&buf, nil)
|
||||
require.NoError(d.t, err)
|
||||
return buf.String()
|
||||
}
|
||||
|
||||
func MakeServer(t *testing.T, dc driver.DoltCmdable, s *driver.Server, dynPorts *DynamicPorts) *driver.SqlServer {
|
||||
if s == nil {
|
||||
return nil
|
||||
}
|
||||
opts := []driver.SqlServerOpt{driver.WithArgs(s.Args...), driver.WithEnvs(s.Envs...), driver.WithName(s.Name)}
|
||||
if s.Port != 0 {
|
||||
opts = append(opts, driver.WithPort(s.Port))
|
||||
args := make([]string, len(s.Args))
|
||||
for i := range args {
|
||||
args[i] = dynPorts.ApplyTemplate(s.Args[i])
|
||||
}
|
||||
opts := []driver.SqlServerOpt{driver.WithArgs(args...), driver.WithEnvs(s.Envs...), driver.WithName(s.Name)}
|
||||
if s.Port != 0 {
|
||||
t.Fatal("cannot specify s.Port on these tests; please use {{get_port ...}} and dynamic_port: to specify a dynamic port.")
|
||||
}
|
||||
if s.DynamicPort == "" {
|
||||
t.Fatal("you must specify s.DynamicPort on these tests; please use {{get_port ...}} and dynamic_port: to specify a dynamic port.")
|
||||
}
|
||||
port, ok := dynPorts.Get(s.DynamicPort)
|
||||
if !ok {
|
||||
t.Fatalf("cannot find dynamic port %s after expanding server config, requested as dynamic server port", s.DynamicPort)
|
||||
}
|
||||
opts = append(opts, driver.WithPort(port))
|
||||
|
||||
var server *driver.SqlServer
|
||||
var err error
|
||||
if s.DebugPort != 0 {
|
||||
server, err = driver.DebugSqlServer(dc, s.DebugPort, opts...)
|
||||
server, err = driver.DebugSqlServer(dc, s.DebugPort, opts...)
|
||||
} else {
|
||||
server, err = driver.StartSqlServer(dc, opts...)
|
||||
}
|
||||
|
||||
|
||||
require.NoError(t, err)
|
||||
if len(s.ErrorMatches) > 0 {
|
||||
err := server.ErrorStop()
|
||||
@@ -124,11 +257,25 @@ func MakeServer(t *testing.T, dc driver.DoltCmdable, s *driver.Server) *driver.S
|
||||
}
|
||||
}
|
||||
|
||||
// Runs the defined test, applying its asserts.
|
||||
//
|
||||
// Supports {{get_port ...}} dynamic port assignment in the following
|
||||
// places:
|
||||
// * Repo with_files contents
|
||||
// * MultiRepo with_files contents
|
||||
// * Server args
|
||||
// * RestartServer args
|
||||
// * Query exec string literals. Currently not args.
|
||||
// * Query result row assert string literals.
|
||||
func (test Test) Run(t *testing.T) {
|
||||
if test.Skip != "" {
|
||||
t.Skip(test.Skip)
|
||||
}
|
||||
|
||||
var ports DynamicPorts
|
||||
ports.global = &GlobalPorts
|
||||
ports.t = t
|
||||
|
||||
u, err := driver.NewDoltUser()
|
||||
require.NoError(t, err)
|
||||
t.Cleanup(func() {
|
||||
@@ -140,17 +287,18 @@ func (test Test) Run(t *testing.T) {
|
||||
servers := make(map[string]*driver.SqlServer)
|
||||
|
||||
for _, r := range test.Repos {
|
||||
repo := MakeRepo(t, rs, r)
|
||||
repo := MakeRepo(t, rs, r, &ports)
|
||||
|
||||
if r.Server.Name == "" {
|
||||
r.Server.Name = r.Name
|
||||
}
|
||||
server := MakeServer(t, repo, r.Server)
|
||||
server := MakeServer(t, repo, r.Server, &ports)
|
||||
if server != nil {
|
||||
server.DBName = r.Name
|
||||
servers[r.Name] = server
|
||||
}
|
||||
}
|
||||
|
||||
for _, mr := range test.MultiRepos {
|
||||
// Each MultiRepo gets its own dolt config --global.
|
||||
u, err := driver.NewDoltUser()
|
||||
@@ -161,16 +309,18 @@ func (test Test) Run(t *testing.T) {
|
||||
rs, err = u.MakeRepoStore()
|
||||
require.NoError(t, err)
|
||||
for _, r := range mr.Repos {
|
||||
MakeRepo(t, rs, r)
|
||||
MakeRepo(t, rs, r, &ports)
|
||||
}
|
||||
for _, f := range mr.WithFiles {
|
||||
f.Template = func(s string) string {
|
||||
return ports.ApplyTemplate(s)
|
||||
}
|
||||
require.NoError(t, f.WriteAtDir(rs.Dir))
|
||||
}
|
||||
|
||||
if mr.Server.Name == "" {
|
||||
mr.Server.Name = mr.Name
|
||||
}
|
||||
server := MakeServer(t, rs, mr.Server)
|
||||
server := MakeServer(t, rs, mr.Server, &ports)
|
||||
if server != nil {
|
||||
servers[mr.Name] = server
|
||||
}
|
||||
@@ -180,7 +330,7 @@ func (test Test) Run(t *testing.T) {
|
||||
server := servers[c.On]
|
||||
require.NotNilf(t, server, "error in test spec: could not find server %s for connection %d", c.On, i)
|
||||
if c.RetryAttempts > 1 {
|
||||
RetryTestRun(t, c.RetryAttempts, func(t require.TestingT) {
|
||||
RetryTestRun(t, c.RetryAttempts, func(t TestingT) {
|
||||
db, err := server.DB(c)
|
||||
require.NoError(t, err)
|
||||
defer db.Close()
|
||||
@@ -190,7 +340,7 @@ func (test Test) Run(t *testing.T) {
|
||||
defer conn.Close()
|
||||
|
||||
for _, q := range c.Queries {
|
||||
RunQueryAttempt(t, conn, q)
|
||||
RunQueryAttempt(t, conn, q, &ports)
|
||||
}
|
||||
})
|
||||
} else {
|
||||
@@ -204,12 +354,20 @@ func (test Test) Run(t *testing.T) {
|
||||
defer conn.Close()
|
||||
|
||||
for _, q := range c.Queries {
|
||||
RunQuery(t, conn, q)
|
||||
RunQuery(t, conn, q, &ports)
|
||||
}
|
||||
}()
|
||||
}
|
||||
if c.RestartServer != nil {
|
||||
err := server.Restart(c.RestartServer.Args, c.RestartServer.Envs)
|
||||
args := c.RestartServer.Args
|
||||
if args != nil {
|
||||
tmplArgs := make([]string, len(*args))
|
||||
for i := range tmplArgs {
|
||||
tmplArgs[i] = ports.ApplyTemplate((*args)[i])
|
||||
}
|
||||
args = &tmplArgs
|
||||
}
|
||||
err := server.Restart(args, c.RestartServer.Envs)
|
||||
require.NoError(t, err)
|
||||
}
|
||||
}
|
||||
@@ -218,8 +376,14 @@ func (test Test) Run(t *testing.T) {
|
||||
func RunTestsFile(t *testing.T, path string) {
|
||||
def, err := ParseTestsFile(path)
|
||||
require.NoError(t, err)
|
||||
parallel := def.Parallel
|
||||
for _, test := range def.Tests {
|
||||
t.Run(test.Name, test.Run)
|
||||
t.Run(test.Name, func(t *testing.T) {
|
||||
if parallel {
|
||||
t.Parallel()
|
||||
}
|
||||
test.Run(t)
|
||||
})
|
||||
}
|
||||
}
|
||||
|
||||
@@ -252,7 +416,7 @@ func (r *retryTestingT) FailNow() {
|
||||
panic(r)
|
||||
}
|
||||
|
||||
func (r *retryTestingT) try(attempts int, test func(require.TestingT)) {
|
||||
func (r *retryTestingT) try(attempts int, test func(TestingT)) {
|
||||
for i := 0; i < attempts; i++ {
|
||||
r.errorfStrings = nil
|
||||
r.errorfArgs = nil
|
||||
@@ -283,7 +447,7 @@ func (r *retryTestingT) try(attempts int, test func(require.TestingT)) {
|
||||
}
|
||||
}
|
||||
|
||||
func RetryTestRun(t *testing.T, attempts int, test func(require.TestingT)) {
|
||||
func RetryTestRun(t *testing.T, attempts int, test func(TestingT)) {
|
||||
if attempts == 0 {
|
||||
attempts = 1
|
||||
}
|
||||
@@ -291,13 +455,13 @@ func RetryTestRun(t *testing.T, attempts int, test func(require.TestingT)) {
|
||||
rtt.try(attempts, test)
|
||||
}
|
||||
|
||||
func RunQuery(t *testing.T, conn *sql.Conn, q driver.Query) {
|
||||
RetryTestRun(t, q.RetryAttempts, func(t require.TestingT) {
|
||||
RunQueryAttempt(t, conn, q)
|
||||
func RunQuery(t *testing.T, conn *sql.Conn, q driver.Query, ports *DynamicPorts) {
|
||||
RetryTestRun(t, q.RetryAttempts, func(t TestingT) {
|
||||
RunQueryAttempt(t, conn, q, ports)
|
||||
})
|
||||
}
|
||||
|
||||
func RunQueryAttempt(t require.TestingT, conn *sql.Conn, q driver.Query) {
|
||||
func RunQueryAttempt(t TestingT, conn *sql.Conn, q driver.Query, ports *DynamicPorts) {
|
||||
args := make([]any, len(q.Args))
|
||||
for i := range q.Args {
|
||||
args[i] = q.Args[i]
|
||||
@@ -323,12 +487,22 @@ func RunQueryAttempt(t require.TestingT, conn *sql.Conn, q driver.Query) {
|
||||
rowstrings, err := RowsToStrings(len(cols), rows)
|
||||
require.NoError(t, err)
|
||||
if q.Result.Rows.Or != nil {
|
||||
require.Contains(t, *q.Result.Rows.Or, rowstrings)
|
||||
match := *q.Result.Rows.Or
|
||||
for i := range match {
|
||||
for j := range match[i] {
|
||||
for k := range match[i][j] {
|
||||
match[i][j][k] = ports.ApplyTemplate(match[i][j][k])
|
||||
}
|
||||
}
|
||||
}
|
||||
require.Contains(t, match, rowstrings)
|
||||
}
|
||||
} else if q.Exec != "" {
|
||||
ctx, c := context.WithTimeout(context.Background(), timeout)
|
||||
defer c()
|
||||
_, err := conn.ExecContext(ctx, q.Exec, args...)
|
||||
exec := q.Exec
|
||||
exec = ports.ApplyTemplate(exec)
|
||||
_, err := conn.ExecContext(ctx, exec, args...)
|
||||
if q.ErrorMatch == "" {
|
||||
require.NoError(t, err, "error running query %s: %v", q.Exec, err)
|
||||
} else {
|
||||
|
||||
@@ -1,3 +1,4 @@
|
||||
parallel: false
|
||||
tests:
|
||||
- name: users and grants cannot be run on standby
|
||||
multi_repos:
|
||||
@@ -8,18 +9,18 @@ tests:
|
||||
log_level: trace
|
||||
listener:
|
||||
host: 0.0.0.0
|
||||
port: 3309
|
||||
port: {{get_port "server1"}}
|
||||
cluster:
|
||||
standby_remotes:
|
||||
- name: standby
|
||||
remote_url_template: http://localhost:3852/{database}
|
||||
remote_url_template: http://localhost:{{get_port "server2_cluster"}}/{database}
|
||||
bootstrap_role: primary
|
||||
bootstrap_epoch: 1
|
||||
remotesapi:
|
||||
port: 3851
|
||||
port: {{get_port "server1_cluster"}}
|
||||
server:
|
||||
args: ["--config", "server.yaml"]
|
||||
port: 3309
|
||||
dynamic_port: server1
|
||||
- name: server2
|
||||
with_files:
|
||||
- name: server.yaml
|
||||
@@ -27,18 +28,18 @@ tests:
|
||||
log_level: trace
|
||||
listener:
|
||||
host: 0.0.0.0
|
||||
port: 3310
|
||||
port: {{get_port "server2"}}
|
||||
cluster:
|
||||
standby_remotes:
|
||||
- name: standby
|
||||
remote_url_template: http://localhost:3851/{database}
|
||||
remote_url_template: http://localhost:{{get_port "server1_cluster"}}/{database}
|
||||
bootstrap_role: standby
|
||||
bootstrap_epoch: 1
|
||||
remotesapi:
|
||||
port: 3852
|
||||
port: {{get_port "server2_cluster"}}
|
||||
server:
|
||||
args: ["--config", "server.yaml"]
|
||||
port: 3310
|
||||
dynamic_port: server2
|
||||
connections:
|
||||
- on: server2
|
||||
queries:
|
||||
@@ -55,18 +56,18 @@ tests:
|
||||
log_level: trace
|
||||
listener:
|
||||
host: 0.0.0.0
|
||||
port: 3309
|
||||
port: {{get_port "server1"}}
|
||||
cluster:
|
||||
standby_remotes:
|
||||
- name: standby
|
||||
remote_url_template: http://localhost:3852/{database}
|
||||
remote_url_template: http://localhost:{{get_port "server2_cluster"}}/{database}
|
||||
bootstrap_role: primary
|
||||
bootstrap_epoch: 1
|
||||
remotesapi:
|
||||
port: 3851
|
||||
port: {{get_port "server1_cluster"}}
|
||||
server:
|
||||
args: ["--config", "server.yaml"]
|
||||
port: 3309
|
||||
dynamic_port: server1
|
||||
- name: server2
|
||||
with_files:
|
||||
- name: server.yaml
|
||||
@@ -74,18 +75,18 @@ tests:
|
||||
log_level: trace
|
||||
listener:
|
||||
host: 0.0.0.0
|
||||
port: 3310
|
||||
port: {{get_port "server2"}}
|
||||
cluster:
|
||||
standby_remotes:
|
||||
- name: standby
|
||||
remote_url_template: http://localhost:3851/{database}
|
||||
remote_url_template: http://localhost:{{get_port "server1_cluster"}}/{database}
|
||||
bootstrap_role: standby
|
||||
bootstrap_epoch: 1
|
||||
remotesapi:
|
||||
port: 3852
|
||||
port: {{get_port "server2_cluster"}}
|
||||
server:
|
||||
args: ["--config", "server.yaml"]
|
||||
port: 3310
|
||||
dynamic_port: server2
|
||||
connections:
|
||||
- on: server2
|
||||
queries:
|
||||
@@ -100,18 +101,18 @@ tests:
|
||||
log_level: trace
|
||||
listener:
|
||||
host: 0.0.0.0
|
||||
port: 3309
|
||||
port: {{get_port "server1"}}
|
||||
cluster:
|
||||
standby_remotes:
|
||||
- name: standby
|
||||
remote_url_template: http://localhost:3852/{database}
|
||||
remote_url_template: http://localhost:{{get_port "server2_cluster"}}/{database}
|
||||
bootstrap_role: primary
|
||||
bootstrap_epoch: 1
|
||||
remotesapi:
|
||||
port: 3851
|
||||
port: {{get_port "server1_cluster"}}
|
||||
server:
|
||||
args: ["--config", "server.yaml"]
|
||||
port: 3309
|
||||
dynamic_port: server1
|
||||
- name: server2
|
||||
with_files:
|
||||
- name: server.yaml
|
||||
@@ -119,18 +120,18 @@ tests:
|
||||
log_level: trace
|
||||
listener:
|
||||
host: 0.0.0.0
|
||||
port: 3310
|
||||
port: {{get_port "server2"}}
|
||||
cluster:
|
||||
standby_remotes:
|
||||
- name: standby
|
||||
remote_url_template: http://localhost:3851/{database}
|
||||
remote_url_template: http://localhost:{{get_port "server1_cluster"}}/{database}
|
||||
bootstrap_role: standby
|
||||
bootstrap_epoch: 1
|
||||
remotesapi:
|
||||
port: 3852
|
||||
port: {{get_port "server2_cluster"}}
|
||||
server:
|
||||
args: ["--config", "server.yaml"]
|
||||
port: 3310
|
||||
dynamic_port: server2
|
||||
connections:
|
||||
- on: server1
|
||||
queries:
|
||||
@@ -152,18 +153,18 @@ tests:
|
||||
log_level: trace
|
||||
listener:
|
||||
host: 0.0.0.0
|
||||
port: 3309
|
||||
port: {{get_port "server1"}}
|
||||
cluster:
|
||||
standby_remotes:
|
||||
- name: standby
|
||||
remote_url_template: http://localhost:3852/{database}
|
||||
remote_url_template: http://localhost:{{get_port "server2_cluster"}}/{database}
|
||||
bootstrap_role: primary
|
||||
bootstrap_epoch: 1
|
||||
remotesapi:
|
||||
port: 3851
|
||||
port: {{get_port "server1_cluster"}}
|
||||
server:
|
||||
args: ["--config", "server.yaml"]
|
||||
port: 3309
|
||||
dynamic_port: server1
|
||||
- name: server2
|
||||
with_files:
|
||||
- name: server.yaml
|
||||
@@ -171,18 +172,18 @@ tests:
|
||||
log_level: trace
|
||||
listener:
|
||||
host: 0.0.0.0
|
||||
port: 3310
|
||||
port: {{get_port "server2"}}
|
||||
cluster:
|
||||
standby_remotes:
|
||||
- name: standby
|
||||
remote_url_template: http://localhost:3851/{database}
|
||||
remote_url_template: http://localhost:{{get_port "server1_cluster"}}/{database}
|
||||
bootstrap_role: standby
|
||||
bootstrap_epoch: 1
|
||||
remotesapi:
|
||||
port: 3852
|
||||
port: {{get_port "server2_cluster"}}
|
||||
server:
|
||||
args: ["--config", "server.yaml"]
|
||||
port: 3310
|
||||
dynamic_port: server2
|
||||
connections:
|
||||
- on: server2
|
||||
queries:
|
||||
|
||||
@@ -1,3 +1,4 @@
|
||||
parallel: true
|
||||
tests:
|
||||
- name: tls, bad root, failover to standby fails
|
||||
multi_repos:
|
||||
@@ -8,15 +9,15 @@ tests:
|
||||
log_level: trace
|
||||
listener:
|
||||
host: 0.0.0.0
|
||||
port: 3309
|
||||
port: {{get_port "server1"}}
|
||||
cluster:
|
||||
standby_remotes:
|
||||
- name: standby
|
||||
remote_url_template: https://localhost:3852/{database}
|
||||
remote_url_template: https://localhost:{{get_port "server2_cluster"}}/{database}
|
||||
bootstrap_role: primary
|
||||
bootstrap_epoch: 1
|
||||
remotesapi:
|
||||
port: 3851
|
||||
port: {{get_port "server1_cluster"}}
|
||||
tls_key: key.pem
|
||||
tls_cert: cert.pem
|
||||
tls_ca: root.pem
|
||||
@@ -28,7 +29,7 @@ tests:
|
||||
source_path: $TESTGENDIR/ed25519_root.pem
|
||||
server:
|
||||
args: ["--config", "server.yaml"]
|
||||
port: 3309
|
||||
dynamic_port: server1
|
||||
- name: server2
|
||||
with_files:
|
||||
- name: server.yaml
|
||||
@@ -36,15 +37,15 @@ tests:
|
||||
log_level: trace
|
||||
listener:
|
||||
host: 0.0.0.0
|
||||
port: 3310
|
||||
port: {{get_port "server2"}}
|
||||
cluster:
|
||||
standby_remotes:
|
||||
- name: standby
|
||||
remote_url_template: https://localhost:3851/{database}
|
||||
remote_url_template: https://localhost:{{get_port "server1_cluster"}}/{database}
|
||||
bootstrap_role: standby
|
||||
bootstrap_epoch: 1
|
||||
remotesapi:
|
||||
port: 3852
|
||||
port: {{get_port "server2_cluster"}}
|
||||
tls_key: key.pem
|
||||
tls_cert: cert.pem
|
||||
tls_ca: root.pem
|
||||
@@ -56,7 +57,7 @@ tests:
|
||||
source_path: $TESTGENDIR/rsa_root.pem
|
||||
server:
|
||||
args: ["--config", "server.yaml"]
|
||||
port: 3310
|
||||
dynamic_port: server2
|
||||
connections:
|
||||
- on: server1
|
||||
queries:
|
||||
@@ -75,15 +76,15 @@ tests:
|
||||
log_level: trace
|
||||
listener:
|
||||
host: 0.0.0.0
|
||||
port: 3309
|
||||
port: {{get_port "server1"}}
|
||||
cluster:
|
||||
standby_remotes:
|
||||
- name: standby
|
||||
remote_url_template: https://localhost:3852/{database}
|
||||
remote_url_template: https://localhost:{{get_port "server2_cluster"}}/{database}
|
||||
bootstrap_role: primary
|
||||
bootstrap_epoch: 1
|
||||
remotesapi:
|
||||
port: 3851
|
||||
port: {{get_port "server1_cluster"}}
|
||||
tls_key: key.pem
|
||||
tls_cert: cert.pem
|
||||
tls_ca: root.pem
|
||||
@@ -95,7 +96,7 @@ tests:
|
||||
source_path: $TESTGENDIR/rsa_root.pem
|
||||
server:
|
||||
args: ["--config", "server.yaml"]
|
||||
port: 3309
|
||||
dynamic_port: server1
|
||||
- name: server2
|
||||
with_files:
|
||||
- name: server.yaml
|
||||
@@ -103,15 +104,15 @@ tests:
|
||||
log_level: trace
|
||||
listener:
|
||||
host: 0.0.0.0
|
||||
port: 3310
|
||||
port: {{get_port "server2"}}
|
||||
cluster:
|
||||
standby_remotes:
|
||||
- name: standby
|
||||
remote_url_template: https://localhost:3851/{database}
|
||||
remote_url_template: https://localhost:{{get_port "server1_cluster"}}/{database}
|
||||
bootstrap_role: standby
|
||||
bootstrap_epoch: 1
|
||||
remotesapi:
|
||||
port: 3852
|
||||
port: {{get_port "server2_cluster"}}
|
||||
tls_key: key.pem
|
||||
tls_cert: cert.pem
|
||||
tls_ca: root.pem
|
||||
@@ -123,7 +124,7 @@ tests:
|
||||
source_path: $TESTGENDIR/rsa_root.pem
|
||||
server:
|
||||
args: ["--config", "server.yaml"]
|
||||
port: 3310
|
||||
dynamic_port: server2
|
||||
connections:
|
||||
- on: server1
|
||||
queries:
|
||||
@@ -142,15 +143,15 @@ tests:
|
||||
log_level: trace
|
||||
listener:
|
||||
host: 0.0.0.0
|
||||
port: 3309
|
||||
port: {{get_port "server1"}}
|
||||
cluster:
|
||||
standby_remotes:
|
||||
- name: standby
|
||||
remote_url_template: https://localhost:3852/{database}
|
||||
remote_url_template: https://localhost:{{get_port "server2_cluster"}}/{database}
|
||||
bootstrap_role: primary
|
||||
bootstrap_epoch: 1
|
||||
remotesapi:
|
||||
port: 3851
|
||||
port: {{get_port "server1_cluster"}}
|
||||
tls_key: key.pem
|
||||
tls_cert: cert.pem
|
||||
tls_ca: root.pem
|
||||
@@ -163,7 +164,7 @@ tests:
|
||||
source_path: $TESTGENDIR/rsa_root.pem
|
||||
server:
|
||||
args: ["--config", "server.yaml"]
|
||||
port: 3309
|
||||
dynamic_port: server1
|
||||
- name: server2
|
||||
with_files:
|
||||
- name: server.yaml
|
||||
@@ -171,15 +172,15 @@ tests:
|
||||
log_level: trace
|
||||
listener:
|
||||
host: 0.0.0.0
|
||||
port: 3310
|
||||
port: {{get_port "server2"}}
|
||||
cluster:
|
||||
standby_remotes:
|
||||
- name: standby
|
||||
remote_url_template: https://localhost:3851/{database}
|
||||
remote_url_template: https://localhost:{{get_port "server1_cluster"}}/{database}
|
||||
bootstrap_role: standby
|
||||
bootstrap_epoch: 1
|
||||
remotesapi:
|
||||
port: 3852
|
||||
port: {{get_port "server2_cluster"}}
|
||||
tls_key: key.pem
|
||||
tls_cert: cert.pem
|
||||
tls_ca: root.pem
|
||||
@@ -191,7 +192,7 @@ tests:
|
||||
source_path: $TESTGENDIR/rsa_root.pem
|
||||
server:
|
||||
args: ["--config", "server.yaml"]
|
||||
port: 3310
|
||||
dynamic_port: server2
|
||||
connections:
|
||||
- on: server1
|
||||
queries:
|
||||
@@ -210,15 +211,15 @@ tests:
|
||||
log_level: trace
|
||||
listener:
|
||||
host: 0.0.0.0
|
||||
port: 3309
|
||||
port: {{get_port "server1"}}
|
||||
cluster:
|
||||
standby_remotes:
|
||||
- name: standby
|
||||
remote_url_template: https://localhost:3852/{database}
|
||||
remote_url_template: https://localhost:{{get_port "server2_cluster"}}/{database}
|
||||
bootstrap_role: primary
|
||||
bootstrap_epoch: 1
|
||||
remotesapi:
|
||||
port: 3851
|
||||
port: {{get_port "server1_cluster"}}
|
||||
tls_key: key.pem
|
||||
tls_cert: cert.pem
|
||||
tls_ca: root.pem
|
||||
@@ -231,7 +232,7 @@ tests:
|
||||
source_path: $TESTGENDIR/rsa_root.pem
|
||||
server:
|
||||
args: ["--config", "server.yaml"]
|
||||
port: 3309
|
||||
dynamic_port: server1
|
||||
- name: server2
|
||||
with_files:
|
||||
- name: server.yaml
|
||||
@@ -239,15 +240,15 @@ tests:
|
||||
log_level: trace
|
||||
listener:
|
||||
host: 0.0.0.0
|
||||
port: 3310
|
||||
port: {{get_port "server2"}}
|
||||
cluster:
|
||||
standby_remotes:
|
||||
- name: standby
|
||||
remote_url_template: https://localhost:3851/{database}
|
||||
remote_url_template: https://localhost:{{get_port "server1_cluster"}}/{database}
|
||||
bootstrap_role: standby
|
||||
bootstrap_epoch: 1
|
||||
remotesapi:
|
||||
port: 3852
|
||||
port: {{get_port "server2_cluster"}}
|
||||
tls_key: key.pem
|
||||
tls_cert: cert.pem
|
||||
tls_ca: root.pem
|
||||
@@ -259,7 +260,7 @@ tests:
|
||||
source_path: $TESTGENDIR/rsa_root.pem
|
||||
server:
|
||||
args: ["--config", "server.yaml"]
|
||||
port: 3310
|
||||
dynamic_port: server2
|
||||
connections:
|
||||
- on: server1
|
||||
queries:
|
||||
@@ -278,15 +279,15 @@ tests:
|
||||
log_level: trace
|
||||
listener:
|
||||
host: 0.0.0.0
|
||||
port: 3309
|
||||
port: {{get_port "server1"}}
|
||||
cluster:
|
||||
standby_remotes:
|
||||
- name: standby
|
||||
remote_url_template: https://localhost:3852/{database}
|
||||
remote_url_template: https://localhost:{{get_port "server2_cluster"}}/{database}
|
||||
bootstrap_role: primary
|
||||
bootstrap_epoch: 1
|
||||
remotesapi:
|
||||
port: 3851
|
||||
port: {{get_port "server1_cluster"}}
|
||||
tls_key: key.pem
|
||||
tls_cert: cert.pem
|
||||
tls_ca: root.pem
|
||||
@@ -298,7 +299,7 @@ tests:
|
||||
source_path: $TESTGENDIR/rsa_root.pem
|
||||
server:
|
||||
args: ["--config", "server.yaml"]
|
||||
port: 3309
|
||||
dynamic_port: server1
|
||||
- name: server2
|
||||
with_files:
|
||||
- name: server.yaml
|
||||
@@ -306,15 +307,15 @@ tests:
|
||||
log_level: trace
|
||||
listener:
|
||||
host: 0.0.0.0
|
||||
port: 3310
|
||||
port: {{get_port "server2"}}
|
||||
cluster:
|
||||
standby_remotes:
|
||||
- name: standby
|
||||
remote_url_template: https://localhost:3851/{database}
|
||||
remote_url_template: https://localhost:{{get_port "server1_cluster"}}/{database}
|
||||
bootstrap_role: standby
|
||||
bootstrap_epoch: 1
|
||||
remotesapi:
|
||||
port: 3852
|
||||
port: {{get_port "server2_cluster"}}
|
||||
tls_key: key.pem
|
||||
tls_cert: cert.pem
|
||||
tls_ca: root.pem
|
||||
@@ -326,7 +327,7 @@ tests:
|
||||
source_path: $TESTGENDIR/rsa_root.pem
|
||||
server:
|
||||
args: ["--config", "server.yaml"]
|
||||
port: 3310
|
||||
dynamic_port: server2
|
||||
connections:
|
||||
- on: server1
|
||||
queries:
|
||||
@@ -385,15 +386,15 @@ tests:
|
||||
log_level: trace
|
||||
listener:
|
||||
host: 0.0.0.0
|
||||
port: 3309
|
||||
port: {{get_port "server1"}}
|
||||
cluster:
|
||||
standby_remotes:
|
||||
- name: standby
|
||||
remote_url_template: https://localhost:3852/{database}
|
||||
remote_url_template: https://localhost:{{get_port "server2_cluster"}}/{database}
|
||||
bootstrap_role: primary
|
||||
bootstrap_epoch: 1
|
||||
remotesapi:
|
||||
port: 3851
|
||||
port: {{get_port "server1_cluster"}}
|
||||
tls_key: key.pem
|
||||
tls_cert: cert.pem
|
||||
tls_ca: root.pem
|
||||
@@ -407,7 +408,7 @@ tests:
|
||||
source_path: $TESTGENDIR/ed25519_root.pem
|
||||
server:
|
||||
args: ["--config", "server.yaml"]
|
||||
port: 3309
|
||||
dynamic_port: server1
|
||||
- name: server2
|
||||
with_files:
|
||||
- name: server.yaml
|
||||
@@ -415,15 +416,15 @@ tests:
|
||||
log_level: trace
|
||||
listener:
|
||||
host: 0.0.0.0
|
||||
port: 3310
|
||||
port: {{get_port "server2"}}
|
||||
cluster:
|
||||
standby_remotes:
|
||||
- name: standby
|
||||
remote_url_template: https://localhost:3851/{database}
|
||||
remote_url_template: https://localhost:{{get_port "server1_cluster"}}/{database}
|
||||
bootstrap_role: standby
|
||||
bootstrap_epoch: 1
|
||||
remotesapi:
|
||||
port: 3852
|
||||
port: {{get_port "server2_cluster"}}
|
||||
tls_key: key.pem
|
||||
tls_cert: cert.pem
|
||||
tls_ca: root.pem
|
||||
@@ -437,7 +438,7 @@ tests:
|
||||
source_path: $TESTGENDIR/ed25519_root.pem
|
||||
server:
|
||||
args: ["--config", "server.yaml"]
|
||||
port: 3310
|
||||
dynamic_port: server2
|
||||
connections:
|
||||
- on: server1
|
||||
queries:
|
||||
|
||||
+53
-49
@@ -1,3 +1,4 @@
|
||||
parallel: true
|
||||
tests:
|
||||
- name: users and grants replicate
|
||||
multi_repos:
|
||||
@@ -8,18 +9,18 @@ tests:
|
||||
log_level: trace
|
||||
listener:
|
||||
host: 0.0.0.0
|
||||
port: 3309
|
||||
port: {{get_port "server1"}}
|
||||
cluster:
|
||||
standby_remotes:
|
||||
- name: standby
|
||||
remote_url_template: http://localhost:3852/{database}
|
||||
remote_url_template: http://localhost:{{get_port "server2_cluster"}}/{database}
|
||||
bootstrap_role: primary
|
||||
bootstrap_epoch: 1
|
||||
remotesapi:
|
||||
port: 3851
|
||||
port: {{get_port "server1_cluster"}}
|
||||
server:
|
||||
args: ["--config", "server.yaml"]
|
||||
port: 3309
|
||||
dynamic_port: server1
|
||||
- name: server2
|
||||
with_files:
|
||||
- name: server.yaml
|
||||
@@ -27,18 +28,18 @@ tests:
|
||||
log_level: trace
|
||||
listener:
|
||||
host: 0.0.0.0
|
||||
port: 3310
|
||||
port: {{get_port "server2"}}
|
||||
cluster:
|
||||
standby_remotes:
|
||||
- name: standby
|
||||
remote_url_template: http://localhost:3851/{database}
|
||||
remote_url_template: http://localhost:{{get_port "server1_cluster"}}/{database}
|
||||
bootstrap_role: standby
|
||||
bootstrap_epoch: 1
|
||||
remotesapi:
|
||||
port: 3852
|
||||
port: {{get_port "server2_cluster"}}
|
||||
server:
|
||||
args: ["--config", "server.yaml"]
|
||||
port: 3310
|
||||
dynamic_port: server2
|
||||
connections:
|
||||
- on: server1
|
||||
queries:
|
||||
@@ -74,18 +75,18 @@ tests:
|
||||
log_level: trace
|
||||
listener:
|
||||
host: 0.0.0.0
|
||||
port: 3309
|
||||
port: {{get_port "server1"}}
|
||||
cluster:
|
||||
standby_remotes:
|
||||
- name: standby
|
||||
remote_url_template: http://localhost:3852/{database}
|
||||
remote_url_template: http://localhost:{{get_port "server2_cluster"}}/{database}
|
||||
bootstrap_role: primary
|
||||
bootstrap_epoch: 1
|
||||
remotesapi:
|
||||
port: 3851
|
||||
port: {{get_port "server1_cluster"}}
|
||||
server:
|
||||
args: ["--config", "server.yaml"]
|
||||
port: 3309
|
||||
dynamic_port: server1
|
||||
- name: server2
|
||||
with_files:
|
||||
- name: server.yaml
|
||||
@@ -93,18 +94,18 @@ tests:
|
||||
log_level: trace
|
||||
listener:
|
||||
host: 0.0.0.0
|
||||
port: 3310
|
||||
port: {{get_port "server2"}}
|
||||
cluster:
|
||||
standby_remotes:
|
||||
- name: standby
|
||||
remote_url_template: http://localhost:3851/{database}
|
||||
remote_url_template: http://localhost:{{get_port "server1_cluster"}}/{database}
|
||||
bootstrap_role: standby
|
||||
bootstrap_epoch: 1
|
||||
remotesapi:
|
||||
port: 3852
|
||||
port: {{get_port "server2_cluster"}}
|
||||
server:
|
||||
args: ["--config", "server.yaml"]
|
||||
port: 3310
|
||||
dynamic_port: server2
|
||||
connections:
|
||||
- on: server1
|
||||
queries:
|
||||
@@ -197,18 +198,18 @@ tests:
|
||||
log_level: trace
|
||||
listener:
|
||||
host: 0.0.0.0
|
||||
port: 3309
|
||||
port: {{get_port "server1"}}
|
||||
cluster:
|
||||
standby_remotes:
|
||||
- name: standby
|
||||
remote_url_template: http://localhost:3852/{database}
|
||||
remote_url_template: http://localhost:{{get_port "server2_cluster"}}/{database}
|
||||
bootstrap_role: primary
|
||||
bootstrap_epoch: 1
|
||||
remotesapi:
|
||||
port: 3851
|
||||
port: {{get_port "server1_cluster"}}
|
||||
server:
|
||||
args: ["--config", "server.yaml"]
|
||||
port: 3309
|
||||
dynamic_port: server1
|
||||
- name: server2
|
||||
with_files:
|
||||
- name: server.yaml
|
||||
@@ -216,24 +217,24 @@ tests:
|
||||
log_level: trace
|
||||
listener:
|
||||
host: 0.0.0.0
|
||||
port: 3310
|
||||
port: {{get_port "server2"}}
|
||||
cluster:
|
||||
standby_remotes:
|
||||
- name: standby
|
||||
remote_url_template: http://localhost:3851/{database}
|
||||
remote_url_template: http://localhost:{{get_port "server1_cluster"}}/{database}
|
||||
bootstrap_role: standby
|
||||
bootstrap_epoch: 1
|
||||
remotesapi:
|
||||
port: 3852
|
||||
port: {{get_port "server2_cluster"}}
|
||||
- name: nocluster.yaml
|
||||
contents: |
|
||||
log_level: trace
|
||||
listener:
|
||||
host: 0.0.0.0
|
||||
port: 3310
|
||||
port: {{get_port "server2"}}
|
||||
server:
|
||||
args: ["--config", "nocluster.yaml"]
|
||||
port: 3310
|
||||
dynamic_port: server2
|
||||
connections:
|
||||
- on: server1
|
||||
queries:
|
||||
@@ -254,6 +255,7 @@ tests:
|
||||
restart_server: {}
|
||||
- on: server1
|
||||
queries:
|
||||
- exec: 'SET @@PERSIST.dolt_cluster_ack_writes_timeout_secs = 10'
|
||||
- exec: 'use repo1'
|
||||
- exec: 'delete from dolt_branch_control'
|
||||
- query: 'show warnings'
|
||||
@@ -275,18 +277,18 @@ tests:
|
||||
log_level: trace
|
||||
listener:
|
||||
host: 0.0.0.0
|
||||
port: 3309
|
||||
port: {{get_port "server1"}}
|
||||
cluster:
|
||||
standby_remotes:
|
||||
- name: standby
|
||||
remote_url_template: http://localhost:3852/{database}
|
||||
remote_url_template: http://localhost:{{get_port "server2_cluster"}}/{database}
|
||||
bootstrap_role: primary
|
||||
bootstrap_epoch: 1
|
||||
remotesapi:
|
||||
port: 3851
|
||||
port: {{get_port "server1_cluster"}}
|
||||
server:
|
||||
args: ["--config", "server.yaml"]
|
||||
port: 3309
|
||||
dynamic_port: server1
|
||||
- name: server2
|
||||
with_files:
|
||||
- name: server.yaml
|
||||
@@ -294,24 +296,24 @@ tests:
|
||||
log_level: trace
|
||||
listener:
|
||||
host: 0.0.0.0
|
||||
port: 3310
|
||||
port: {{get_port "server2"}}
|
||||
cluster:
|
||||
standby_remotes:
|
||||
- name: standby
|
||||
remote_url_template: http://localhost:3851/{database}
|
||||
remote_url_template: http://localhost:{{get_port "server1_cluster"}}/{database}
|
||||
bootstrap_role: standby
|
||||
bootstrap_epoch: 1
|
||||
remotesapi:
|
||||
port: 3852
|
||||
port: {{get_port "server2_cluster"}}
|
||||
- name: nocluster.yaml
|
||||
contents: |
|
||||
log_level: trace
|
||||
listener:
|
||||
host: 0.0.0.0
|
||||
port: 3310
|
||||
port: {{get_port "server2"}}
|
||||
server:
|
||||
args: ["--config", "nocluster.yaml"]
|
||||
port: 3310
|
||||
dynamic_port: server2
|
||||
connections:
|
||||
- on: server1
|
||||
queries:
|
||||
@@ -328,6 +330,8 @@ tests:
|
||||
restart_server: {}
|
||||
- on: server1
|
||||
queries:
|
||||
# Because we run in parallel, do not be too agressive about the timeout...
|
||||
- exec: 'SET @@PERSIST.dolt_cluster_ack_writes_timeout_secs = 10'
|
||||
- exec: 'create user "brian"@"%" IDENTIFIED BY "brianspassword"'
|
||||
- query: 'show warnings'
|
||||
result:
|
||||
@@ -350,20 +354,20 @@ tests:
|
||||
log_level: trace
|
||||
listener:
|
||||
host: 0.0.0.0
|
||||
port: 3309
|
||||
port: {{get_port "server1"}}
|
||||
cluster:
|
||||
standby_remotes:
|
||||
- name: standby1
|
||||
remote_url_template: http://localhost:3852/{database}
|
||||
remote_url_template: http://localhost:{{get_port "server2_cluster"}}/{database}
|
||||
- name: standby2
|
||||
remote_url_template: http://localhost:3853/{database}
|
||||
remote_url_template: http://localhost:{{get_port "server3_cluster"}}/{database}
|
||||
bootstrap_role: primary
|
||||
bootstrap_epoch: 1
|
||||
remotesapi:
|
||||
port: 3851
|
||||
port: {{get_port "server1_cluster"}}
|
||||
server:
|
||||
args: ["--config", "server.yaml"]
|
||||
port: 3309
|
||||
dynamic_port: server1
|
||||
- name: server2
|
||||
with_files:
|
||||
- name: server.yaml
|
||||
@@ -371,20 +375,20 @@ tests:
|
||||
log_level: trace
|
||||
listener:
|
||||
host: 0.0.0.0
|
||||
port: 3310
|
||||
port: {{get_port "server2"}}
|
||||
cluster:
|
||||
standby_remotes:
|
||||
- name: standby1
|
||||
remote_url_template: http://localhost:3851/{database}
|
||||
remote_url_template: http://localhost:{{get_port "server1_cluster"}}/{database}
|
||||
- name: standby2
|
||||
remote_url_template: http://localhost:3853/{database}
|
||||
remote_url_template: http://localhost:{{get_port "server3_cluster"}}/{database}
|
||||
bootstrap_role: standby
|
||||
bootstrap_epoch: 1
|
||||
remotesapi:
|
||||
port: 3852
|
||||
port: {{get_port "server2_cluster"}}
|
||||
server:
|
||||
args: ["--config", "server.yaml"]
|
||||
port: 3310
|
||||
dynamic_port: server2
|
||||
- name: server3
|
||||
with_files:
|
||||
- name: server.yaml
|
||||
@@ -392,20 +396,20 @@ tests:
|
||||
log_level: trace
|
||||
listener:
|
||||
host: 0.0.0.0
|
||||
port: 3311
|
||||
port: {{get_port "server3"}}
|
||||
cluster:
|
||||
standby_remotes:
|
||||
- name: standby1
|
||||
remote_url_template: http://localhost:3851/{database}
|
||||
remote_url_template: http://localhost:{{get_port "server1_cluster"}}/{database}
|
||||
- name: standby2
|
||||
remote_url_template: http://localhost:3852/{database}
|
||||
remote_url_template: http://localhost:{{get_port "server2_cluster"}}/{database}
|
||||
bootstrap_role: standby
|
||||
bootstrap_epoch: 1
|
||||
remotesapi:
|
||||
port: 3853
|
||||
port: {{get_port "server3_cluster"}}
|
||||
server:
|
||||
args: ["--config", "server.yaml"]
|
||||
port: 3311
|
||||
dynamic_port: server3
|
||||
connections:
|
||||
- on: server1
|
||||
queries:
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
@@ -1,3 +1,4 @@
|
||||
parallel: true
|
||||
tests:
|
||||
- name: persist global variable before server startup
|
||||
repos:
|
||||
@@ -7,7 +8,8 @@ tests:
|
||||
contents: |
|
||||
{"sqlserver.global.max_connections":"1000"}
|
||||
server:
|
||||
args: ["-l", "trace"]
|
||||
args: ["-l", "trace", "-P", '{{get_port "repo1"}}']
|
||||
dynamic_port: repo1
|
||||
connections:
|
||||
- on: repo1
|
||||
queries:
|
||||
@@ -23,7 +25,8 @@ tests:
|
||||
contents: |
|
||||
{"sqlserver.global.unknown":"1000"}
|
||||
server:
|
||||
args: ["-l", "trace"]
|
||||
args: ["-l", "trace", "-P", '{{get_port "repo1"}}']
|
||||
dynamic_port: repo1
|
||||
log_matches:
|
||||
- "warning: persisted system variable unknown was not loaded since its definition does not exist."
|
||||
connections:
|
||||
@@ -36,6 +39,8 @@ tests:
|
||||
contents: |
|
||||
{"sqlserver.global.max_connections":"string"}
|
||||
server:
|
||||
args: ["-P", '{{get_port "repo1"}}']
|
||||
dynamic_port: repo1
|
||||
log_matches:
|
||||
- "error: failed to load persisted global variables: key: 'max_connections'; strconv.ParseInt: parsing \"string\": invalid syntax"
|
||||
connections:
|
||||
@@ -44,7 +49,8 @@ tests:
|
||||
repos:
|
||||
- name: repo1
|
||||
server:
|
||||
args: ["-l", "trace"]
|
||||
args: ["-l", "trace", "-P", '{{get_port "repo1"}}']
|
||||
dynamic_port: repo1
|
||||
connections:
|
||||
- on: repo1
|
||||
queries:
|
||||
@@ -64,7 +70,8 @@ tests:
|
||||
repos:
|
||||
- name: repo1
|
||||
server:
|
||||
args: ["-l", "trace"]
|
||||
args: ["-l", "trace", "-P", '{{get_port "repo1"}}']
|
||||
dynamic_port: repo1
|
||||
connections:
|
||||
- on: repo1
|
||||
queries:
|
||||
@@ -92,7 +99,8 @@ tests:
|
||||
repos:
|
||||
- name: repo1
|
||||
server:
|
||||
args: ["-l", "trace"]
|
||||
args: ["-l", "trace", "-P", '{{get_port "repo1"}}']
|
||||
dynamic_port: repo1
|
||||
connections:
|
||||
- on: repo1
|
||||
queries:
|
||||
@@ -120,7 +128,8 @@ tests:
|
||||
repos:
|
||||
- name: repo1
|
||||
server:
|
||||
args: ["-l", "trace"]
|
||||
args: ["-l", "trace", "-P", '{{get_port "repo1"}}']
|
||||
dynamic_port: repo1
|
||||
connections:
|
||||
- on: repo1
|
||||
queries:
|
||||
@@ -157,7 +166,8 @@ tests:
|
||||
repos:
|
||||
- name: repo1
|
||||
server:
|
||||
args: ["-l", "trace"]
|
||||
args: ["-l", "trace", "-P", '{{get_port "repo1"}}']
|
||||
dynamic_port: repo1
|
||||
connections:
|
||||
- on: repo1
|
||||
queries:
|
||||
@@ -178,7 +188,8 @@ tests:
|
||||
repos:
|
||||
- name: repo1
|
||||
server:
|
||||
args: ["-l", "trace"]
|
||||
args: ["-l", "trace", "-P", '{{get_port "repo1"}}']
|
||||
dynamic_port: repo1
|
||||
connections:
|
||||
- on: repo1
|
||||
queries:
|
||||
@@ -187,7 +198,9 @@ tests:
|
||||
- name: persist invalid global variable value during server session
|
||||
repos:
|
||||
- name: repo1
|
||||
server: {}
|
||||
server:
|
||||
args: ["-P", '{{get_port "repo1"}}']
|
||||
dynamic_port: repo1
|
||||
connections:
|
||||
- on: repo1
|
||||
queries:
|
||||
@@ -202,8 +215,10 @@ tests:
|
||||
log_level: trace
|
||||
listener:
|
||||
max_connections: 999
|
||||
port: {{get_port "repo1"}}
|
||||
server:
|
||||
args: ["--config", "server.yaml"]
|
||||
dynamic_port: repo1
|
||||
connections:
|
||||
- on: repo1
|
||||
queries:
|
||||
@@ -215,7 +230,8 @@ tests:
|
||||
repos:
|
||||
- name: repo1
|
||||
server:
|
||||
args: []
|
||||
args: ["-P", '{{get_port "repo1"}}']
|
||||
dynamic_port: repo1
|
||||
connections:
|
||||
- on: repo1
|
||||
queries:
|
||||
@@ -227,7 +243,8 @@ tests:
|
||||
repos:
|
||||
- name: repo1
|
||||
server:
|
||||
args: ["--max-connections", "555"]
|
||||
args: ["--max-connections", "555", "-P", '{{get_port "repo1"}}']
|
||||
dynamic_port: repo1
|
||||
connections:
|
||||
- on: repo1
|
||||
queries:
|
||||
@@ -239,7 +256,8 @@ tests:
|
||||
repos:
|
||||
- name: repo1
|
||||
server:
|
||||
args: ["-l", "warning"]
|
||||
args: ["-l", "warning", "-P", '{{get_port "repo1"}}']
|
||||
dynamic_port: repo1
|
||||
log_matches:
|
||||
- "Starting query"
|
||||
connections:
|
||||
@@ -259,7 +277,7 @@ tests:
|
||||
columns: ["@@GLOBAL.dolt_log_level"]
|
||||
rows: [["trace"]]
|
||||
restart_server:
|
||||
args: ["-l", "info"]
|
||||
args: ["-l", "info", "-P", '{{get_port "repo1"}}']
|
||||
- on: repo1
|
||||
queries:
|
||||
- query: "select @@GLOBAL.dolt_log_level"
|
||||
@@ -275,8 +293,11 @@ tests:
|
||||
system_variables:
|
||||
secure_file_priv: "/dev/null"
|
||||
max_connections: 1000
|
||||
listener:
|
||||
port: {{get_port "repo1"}}
|
||||
server:
|
||||
args: ["-l", "trace", "--config", "config.yaml"]
|
||||
dynamic_port: repo1
|
||||
connections:
|
||||
- on: repo1
|
||||
queries:
|
||||
@@ -292,8 +313,11 @@ tests:
|
||||
contents: |
|
||||
system_variables:
|
||||
secure_file_priv: "/dev/null"
|
||||
listener:
|
||||
port: {{get_port "repo1"}}
|
||||
server:
|
||||
args: ["-l", "trace", "--config", "config.yaml"]
|
||||
dynamic_port: repo1
|
||||
connections:
|
||||
- on: repo1
|
||||
queries:
|
||||
@@ -318,21 +342,28 @@ tests:
|
||||
contents: |
|
||||
system_variables:
|
||||
secure_file_priv: ""
|
||||
listener:
|
||||
port: {{get_port "repo1"}}
|
||||
- name: "known_contents"
|
||||
contents: |
|
||||
system_variables:
|
||||
secure_file_priv: ""
|
||||
server:
|
||||
args: ["-l", "trace", "--config", "config.yaml"]
|
||||
dynamic_port: repo1
|
||||
connections:
|
||||
- on: repo1
|
||||
queries:
|
||||
- query: "select LOAD_FILE('config.yaml')"
|
||||
- query: "select LOAD_FILE('known_contents')"
|
||||
result:
|
||||
columns: ["LOAD_FILE('config.yaml')"]
|
||||
columns: ["LOAD_FILE('known_contents')"]
|
||||
rows: [["system_variables:\n secure_file_priv: \"\"\n"]]
|
||||
- query: "select LOAD_FILE('./.dolt/../config.yaml')"
|
||||
- query: "select LOAD_FILE('./.dolt/../known_contents')"
|
||||
result:
|
||||
columns: ["LOAD_FILE('./.dolt/../config.yaml')"]
|
||||
columns: ["LOAD_FILE('./.dolt/../known_contents')"]
|
||||
rows: [["system_variables:\n secure_file_priv: \"\"\n"]]
|
||||
- exec: "create table loaded (contents text)"
|
||||
- exec: "load data infile \"config.yaml\" into table loaded lines terminated by \"\\0\""
|
||||
- exec: "load data infile \"known_contents\" into table loaded lines terminated by \"\\0\""
|
||||
- query: "select contents from loaded"
|
||||
result:
|
||||
columns: ["contents"]
|
||||
|
||||
@@ -1,3 +1,4 @@
|
||||
parallel: true
|
||||
tests:
|
||||
- name: jwt auth from config
|
||||
repos:
|
||||
@@ -15,6 +16,7 @@ tests:
|
||||
tls_key: chain_key.pem
|
||||
tls_cert: chain_cert.pem
|
||||
require_secure_transport: true
|
||||
port: {{get_port "server1"}}
|
||||
jwks:
|
||||
- name: jwksname
|
||||
location_url: file:///test_jwks.json
|
||||
@@ -26,6 +28,7 @@ tests:
|
||||
fields_to_log: [on_behalf_of,id]
|
||||
server:
|
||||
args: ["--config", "server.yaml"]
|
||||
dynamic_port: server1
|
||||
connections:
|
||||
- on: repo1
|
||||
queries:
|
||||
|
||||
@@ -1,15 +1,19 @@
|
||||
parallel: true
|
||||
tests:
|
||||
- name: read-only flag prevents modification
|
||||
repos:
|
||||
- name: repo1
|
||||
server:
|
||||
args: ["--config", "readonly.yaml"]
|
||||
dynamic_port: server1
|
||||
with_files:
|
||||
- name: readonly.yaml
|
||||
contents: |
|
||||
log_level: trace
|
||||
behavior:
|
||||
read_only: true
|
||||
listener:
|
||||
port: {{get_port "server1"}}
|
||||
connections:
|
||||
- on: repo1
|
||||
queries:
|
||||
@@ -26,12 +30,16 @@ tests:
|
||||
- name: read-only flag still allows select
|
||||
repos:
|
||||
- name: repo1
|
||||
server: {}
|
||||
server:
|
||||
args: ["--port", "{{get_port \"server1\"}}"]
|
||||
dynamic_port: server1
|
||||
with_files:
|
||||
- name: readonly.yaml
|
||||
contents: |
|
||||
behavior:
|
||||
read_only: true
|
||||
listener:
|
||||
port: {{get_port "server1"}}
|
||||
connections:
|
||||
- on: repo1
|
||||
queries:
|
||||
@@ -51,12 +59,15 @@ tests:
|
||||
- name: repo1
|
||||
server:
|
||||
args: ["--config", "readonly.yaml"]
|
||||
dynamic_port: server1
|
||||
with_files:
|
||||
- name: readonly.yaml
|
||||
contents: |
|
||||
log_level: trace
|
||||
behavior:
|
||||
read_only: true
|
||||
listener:
|
||||
port: {{get_port "server1"}}
|
||||
connections:
|
||||
- on: repo1
|
||||
queries:
|
||||
@@ -66,13 +77,17 @@ tests:
|
||||
skip: read-only flag does not prevent dolt_reset
|
||||
repos:
|
||||
- name: repo1
|
||||
server: {}
|
||||
server:
|
||||
args: ["--port", "{{get_port \"server1\"}}"]
|
||||
dynamic_port: server1
|
||||
with_files:
|
||||
- name: readonly.yaml
|
||||
contents: |
|
||||
log_level: trace
|
||||
behavior:
|
||||
read_only: true
|
||||
listener:
|
||||
port: {{get_port "server1"}}
|
||||
connections:
|
||||
- on: repo1
|
||||
queries:
|
||||
@@ -86,15 +101,21 @@ tests:
|
||||
- name: port in use
|
||||
repos:
|
||||
- name: repo1
|
||||
server: {}
|
||||
server:
|
||||
args: ["--port", "{{get_port \"server1\"}}"]
|
||||
dynamic_port: server1
|
||||
- name: repo2
|
||||
server:
|
||||
args: ["--port", "{{get_port \"server1\"}}"]
|
||||
dynamic_port: server1
|
||||
error_matches:
|
||||
- "already in use"
|
||||
- name: test autocommit
|
||||
repos:
|
||||
- name: repo1
|
||||
server: {}
|
||||
server:
|
||||
args: ["--port", "{{get_port \"server1\"}}"]
|
||||
dynamic_port: server1
|
||||
connections:
|
||||
- on: repo1
|
||||
queries:
|
||||
@@ -109,7 +130,9 @@ tests:
|
||||
- name: test basic querying via dolt sql-server
|
||||
repos:
|
||||
- name: repo1
|
||||
server: {}
|
||||
server:
|
||||
args: ["--port", "{{get_port \"server1\"}}"]
|
||||
dynamic_port: server1
|
||||
connections:
|
||||
- on: repo1
|
||||
queries:
|
||||
@@ -163,7 +186,9 @@ tests:
|
||||
- name: test multiple queries on same connection
|
||||
repos:
|
||||
- name: repo1
|
||||
server: {}
|
||||
server:
|
||||
args: ["--port", "{{get_port \"server1\"}}"]
|
||||
dynamic_port: server1
|
||||
connections:
|
||||
- on: repo1
|
||||
queries:
|
||||
@@ -198,7 +223,9 @@ tests:
|
||||
- name: test CREATE and DROP database via sql-server
|
||||
repos:
|
||||
- name: repo1
|
||||
server: {}
|
||||
server:
|
||||
args: ["--port", "{{get_port \"server1\"}}"]
|
||||
dynamic_port: server1
|
||||
connections:
|
||||
- on: repo1
|
||||
queries:
|
||||
@@ -223,7 +250,9 @@ tests:
|
||||
- name: LOAD DATA LOCAL INFILE works
|
||||
repos:
|
||||
- name: repo1
|
||||
server: {}
|
||||
server:
|
||||
args: ["--port", "{{get_port \"server1\"}}"]
|
||||
dynamic_port: server1
|
||||
connections:
|
||||
- on: repo1
|
||||
queries:
|
||||
@@ -239,7 +268,9 @@ tests:
|
||||
- name: LOAD DATA LOCAL INFILE automatically ignores row with existing primary key
|
||||
repos:
|
||||
- name: repo1
|
||||
server: {}
|
||||
server:
|
||||
args: ["--port", "{{get_port \"server1\"}}"]
|
||||
dynamic_port: server1
|
||||
connections:
|
||||
- on: repo1
|
||||
queries:
|
||||
@@ -256,7 +287,9 @@ tests:
|
||||
- name: LOAD DATA LOCAL INFILE can replace row with existing primary key
|
||||
repos:
|
||||
- name: repo1
|
||||
server: {}
|
||||
server:
|
||||
args: ["--port", "{{get_port \"server1\"}}"]
|
||||
dynamic_port: server1
|
||||
connections:
|
||||
- on: repo1
|
||||
queries:
|
||||
@@ -273,7 +306,9 @@ tests:
|
||||
- name: JSON queries
|
||||
repos:
|
||||
- name: repo1
|
||||
server: {}
|
||||
server:
|
||||
args: ["--port", "{{get_port \"server1\"}}"]
|
||||
dynamic_port: server1
|
||||
connections:
|
||||
- on: repo1
|
||||
queries:
|
||||
@@ -296,7 +331,9 @@ tests:
|
||||
- name: select a branch with the USE syntax
|
||||
repos:
|
||||
- name: repo1
|
||||
server: {}
|
||||
server:
|
||||
args: ["--port", "{{get_port \"server1\"}}"]
|
||||
dynamic_port: server1
|
||||
connections:
|
||||
- on: repo1
|
||||
queries:
|
||||
@@ -321,7 +358,9 @@ tests:
|
||||
- name: auto increment for a table should reset between drops
|
||||
repos:
|
||||
- name: repo1
|
||||
server: {}
|
||||
server:
|
||||
args: ["--port", "{{get_port \"server1\"}}"]
|
||||
dynamic_port: server1
|
||||
connections:
|
||||
- on: repo1
|
||||
queries:
|
||||
@@ -341,7 +380,9 @@ tests:
|
||||
- name: Create a temporary table and validate that it doesn't persist after a session closes
|
||||
repos:
|
||||
- name: repo1
|
||||
server: {}
|
||||
server:
|
||||
args: ["--port", "{{get_port \"server1\"}}"]
|
||||
dynamic_port: server1
|
||||
connections:
|
||||
- on: repo1
|
||||
queries:
|
||||
@@ -360,6 +401,8 @@ tests:
|
||||
- name: server1
|
||||
server:
|
||||
envs: ["DOLT_DISABLE_CHUNK_JOURNAL=true"]
|
||||
args: ["--port", "{{get_port \"server1\"}}"]
|
||||
dynamic_port: server1
|
||||
connections:
|
||||
- on: server1
|
||||
queries:
|
||||
|
||||
@@ -1,3 +1,4 @@
|
||||
parallel: true
|
||||
tests:
|
||||
- name: can clone from server1 remotesapi endpoint
|
||||
multi_repos:
|
||||
@@ -6,8 +7,8 @@ tests:
|
||||
- name: repo1
|
||||
- name: repo2
|
||||
server:
|
||||
args: ["--remotesapi-port", "50051", "--port", "3309"]
|
||||
port: 3309
|
||||
args: ["--remotesapi-port", "{{get_port \"remotesapi_port\"}}", "--port", "{{get_port \"server_port\"}}"]
|
||||
dynamic_port: server_port
|
||||
- name: server2
|
||||
repos:
|
||||
- name: repo1
|
||||
@@ -17,10 +18,10 @@ tests:
|
||||
log_level: trace
|
||||
listener:
|
||||
host: 0.0.0.0
|
||||
port: 3308
|
||||
port: {{get_port "server2_port"}}
|
||||
server:
|
||||
args: ["--config", "server.yaml"]
|
||||
port: 3308
|
||||
dynamic_port: server2_port
|
||||
connections:
|
||||
- on: server1
|
||||
queries:
|
||||
@@ -31,7 +32,7 @@ tests:
|
||||
- on: server2
|
||||
queries:
|
||||
- exec: "use repo1"
|
||||
- exec: "call dolt_clone('http://localhost:50051/repo2')"
|
||||
- exec: "call dolt_clone('http://localhost:{{get_port \"remotesapi_port\"}}/repo2')"
|
||||
- exec: "use repo2"
|
||||
- query: "select count(*) from vals"
|
||||
result:
|
||||
@@ -44,8 +45,8 @@ tests:
|
||||
- name: repo1
|
||||
- name: repo2
|
||||
server:
|
||||
args: ["--remotesapi-port", "50051", "--port", "3309"]
|
||||
port: 3309
|
||||
args: ["--remotesapi-port", "{{get_port \"remotesapi_port\"}}", "--port", "{{get_port \"server_port\"}}"]
|
||||
dynamic_port: server_port
|
||||
- name: server2
|
||||
repos:
|
||||
- name: repo1
|
||||
@@ -55,10 +56,10 @@ tests:
|
||||
log_level: trace
|
||||
listener:
|
||||
host: 0.0.0.0
|
||||
port: 3308
|
||||
port: {{get_port "server2_port"}}
|
||||
server:
|
||||
args: ["--config", "server.yaml"]
|
||||
port: 3308
|
||||
dynamic_port: server2_port
|
||||
connections:
|
||||
- on: server1
|
||||
queries:
|
||||
@@ -75,7 +76,7 @@ tests:
|
||||
- on: server2
|
||||
queries:
|
||||
- exec: "use repo1"
|
||||
- exec: "call dolt_clone('http://localhost:50051/repo2')"
|
||||
- exec: "call dolt_clone('http://localhost:{{get_port \"remotesapi_port\"}}/repo2')"
|
||||
- exec: "use repo2"
|
||||
- query: "select count(*) from vals"
|
||||
result:
|
||||
|
||||
@@ -1,3 +1,4 @@
|
||||
parallel: true
|
||||
tests:
|
||||
- name: require_secure_transport no key or cert
|
||||
repos:
|
||||
@@ -7,8 +8,10 @@ tests:
|
||||
contents: |
|
||||
listener:
|
||||
require_secure_transport: true
|
||||
port: {{get_port "server"}}
|
||||
server:
|
||||
args: ["--config", "server.yaml"]
|
||||
dynamic_port: server
|
||||
error_matches:
|
||||
- "require_secure_transport can only be `true` when a tls_key and tls_cert are provided."
|
||||
- name: tls_key non-existent
|
||||
@@ -24,8 +27,10 @@ tests:
|
||||
listener:
|
||||
tls_key: doesnotexist_key.pem
|
||||
tls_cert: chain_cert.pem
|
||||
port: {{get_port "server"}}
|
||||
server:
|
||||
args: ["--config", "server.yaml"]
|
||||
dynamic_port: server
|
||||
error_matches:
|
||||
- "no such file or directory"
|
||||
- name: tls_cert non-existent
|
||||
@@ -41,8 +46,10 @@ tests:
|
||||
listener:
|
||||
tls_key: chain_key.pem
|
||||
tls_cert: doesnotexist_key.pem
|
||||
port: {{get_port "server"}}
|
||||
server:
|
||||
args: ["--config", "server.yaml"]
|
||||
dynamic_port: server
|
||||
error_matches:
|
||||
- "no such file or directory"
|
||||
|
||||
@@ -62,8 +69,10 @@ tests:
|
||||
tls_key: chain_key.pem
|
||||
tls_cert: chain_cert.pem
|
||||
require_secure_transport: true
|
||||
port: {{get_port "server"}}
|
||||
server:
|
||||
args: ["--config", "server.yaml"]
|
||||
dynamic_port: server
|
||||
connections:
|
||||
- on: repo1
|
||||
queries:
|
||||
|
||||
Reference in New Issue
Block a user