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:
Aaron Son
2025-03-25 09:43:53 -07:00
committed by GitHub
17 changed files with 946 additions and 515 deletions
@@ -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)
+205 -31
View File
@@ -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:
@@ -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: