integration-tests/go-sql-server-driver: Start migrating over some simple tests from sql-server.bats.

This commit is contained in:
Aaron Son
2022-10-03 14:00:56 -07:00
parent a2f1e06b75
commit 153ea002e4
6 changed files with 318 additions and 246 deletions

View File

@@ -140,131 +140,6 @@ SQL
}
@test "sql-server: port in use" {
cd repo1
let PORT="$$ % (65536-1024) + 1024"
dolt sql-server --host 0.0.0.0 --port=$PORT --user dolt &
SERVER_PID=$! # will get killed by teardown_common
sleep 5 # not using python wait so this works on windows
run dolt sql-server --host 0.0.0.0 --port=$PORT --user dolt
[ "$status" -eq 1 ]
[[ "$output" =~ "in use" ]] || false
}
@test "sql-server: test autocommit" {
skiponwindows "Missing dependencies"
cd repo1
start_sql_server repo1
# No tables at the start
run dolt ls
[ "$status" -eq 0 ]
[[ "$output" =~ "No tables in working set" ]] || false
# create table with autocommit off and verify there are still no tables
server_query repo1 0 dolt "" "CREATE TABLE one_pk (
pk BIGINT NOT NULL COMMENT 'tag:0',
c1 BIGINT COMMENT 'tag:1',
c2 BIGINT COMMENT 'tag:2',
PRIMARY KEY (pk)
)" ""
run dolt ls
[ "$status" -eq 0 ]
[[ "$output" =~ "No tables in working set" ]] || false
# create table with autocommit on and verify table creation
server_query repo1 1 dolt "" "CREATE TABLE one_pk (
pk BIGINT NOT NULL COMMENT 'tag:0',
c1 BIGINT COMMENT 'tag:1',
c2 BIGINT COMMENT 'tag:2',
PRIMARY KEY (pk)
)" ""
run dolt ls
[ "$status" -eq 0 ]
[[ "$output" =~ "one_pk" ]] || false
}
@test "sql-server: read-only flag prevents modification" {
skiponwindows "Missing dependencies"
cd repo1
DEFAULT_DB="$1"
let PORT="$$ % (65536-1024) + 1024"
echo "
read_only: true" > server.yaml
start_sql_server_with_config repo1 server.yaml
# No tables at the start
run dolt ls
[ "$status" -eq 0 ]
[[ "$output" =~ "No tables in working set" ]] || false
# attempt to create table (autocommit on), expect either some exception
server_query repo1 1 dolt "" "CREATE TABLE i_should_not_exist (
c0 INT
)" "" "database server is set to read only mode"
# Expect that there are still no tables
run dolt ls
[ "$status" -eq 0 ]
[[ "$output" =~ "No tables in working set" ]] || false
}
@test "sql-server: read-only flag still allows select" {
skiponwindows "Missing dependencies"
cd repo1
dolt sql -q "create table t(c0 int)"
dolt sql -q "insert into t values (1)"
DEFAULT_DB="$1"
let PORT="$$ % (65536-1024) + 1024"
echo "
read_only: true" > server.yaml
start_sql_server_with_config repo1 server.yaml
# make a select query
server_query repo1 1 dolt "" "select * from t" "c0\n1"
}
@test "sql-server: read-only flag prevents dolt_commit" {
skiponwindows "Missing dependencies"
cd repo1
DEFAULT_DB="$1"
let PORT="$$ % (65536-1024) + 1024"
echo "
read_only: true" > server.yaml
start_sql_server_with_config repo1 server.yaml
# make a dolt_commit query
skip "read-only flag does not prevent dolt_commit"
server_query repo1 1 dolt "" "call dolt_commit('--allow-empty', '-m', 'msg')" "" "database server is set to read only mode: user does not have permission: write"
}
@test "sql-server: read-only flag prevents dolt_reset" {
skiponwindows "Missing dependencies"
cd repo1
run dolt commit --allow-empty -m 'empty test commit'
DEFAULT_DB="$1"
let PORT="$$ % (65536-1024) + 1024"
echo "
read_only: true" > server.yaml
start_sql_server_with_config repo1 server.yaml
# try to execute dolt_reset
skip "read-only flag does not prevent dolt_reset"
server_query repo1 1 dolt "" "call dolt_reset('--hard', 'HEAD~1')" "" "database server is set to read only mode: user does not have permission: write"
}
@test "sql-server: test command line modification" {
skiponwindows "Missing dependencies"
@@ -361,47 +236,6 @@ SQL
[[ "$output" =~ "Commit1" ]] || false
}
@test "sql-server: test basic querying via dolt sql-server" {
skiponwindows "Missing dependencies"
cd repo1
start_sql_server repo1
server_query repo1 1 dolt "" "SHOW tables" ""
server_query repo1 1 dolt "" "CREATE TABLE one_pk (
pk BIGINT NOT NULL COMMENT 'tag:0',
c1 BIGINT COMMENT 'tag:1',
c2 BIGINT COMMENT 'tag:2',
PRIMARY KEY (pk)
)" ""
server_query repo1 1 dolt "" "SHOW tables" "Tables_in_repo1\none_pk"
server_query repo1 1 dolt "" "INSERT INTO one_pk (pk) VALUES (0)"
server_query repo1 1 dolt "" "SELECT * FROM one_pk ORDER BY pk" "pk,c1,c2\n0,None,None"
server_query repo1 1 dolt "" "INSERT INTO one_pk (pk,c1) VALUES (1,1)"
server_query repo1 1 dolt "" "INSERT INTO one_pk (pk,c1,c2) VALUES (2,2,2),(3,3,3)"
server_query repo1 1 dolt "" "SELECT * FROM one_pk ORDER by pk" "pk,c1,c2\n0,None,None\n1,1,None\n2,2,2\n3,3,3"
server_query repo1 1 dolt "" "UPDATE one_pk SET c2=c1 WHERE c2 is NULL and c1 IS NOT NULL"
}
@test "sql-server: test multiple queries on the same connection" {
skiponwindows "Missing dependencies"
cd repo1
start_sql_server repo1
server_query repo1 1 dolt "" "CREATE TABLE one_pk (
pk BIGINT NOT NULL COMMENT 'tag:0',
c1 BIGINT COMMENT 'tag:1',
c2 BIGINT COMMENT 'tag:2',
PRIMARY KEY (pk)
);
INSERT INTO one_pk (pk) VALUES (0);
INSERT INTO one_pk (pk,c1) VALUES (1,1);
INSERT INTO one_pk (pk,c1,c2) VALUES (2,2,2),(3,3,3);"
server_query repo1 1 dolt "" "SELECT * FROM one_pk ORDER by pk" "pk,c1,c2\n0,None,None\n1,1,None\n2,2,2\n3,3,3"
}
@test "sql-server: test reset_hard" {
skiponwindows "Missing dependencies"
@@ -553,24 +387,6 @@ SQL
server_query repo1 1 dolt "" "SELECT * FROM repo2.r2_one_pk" "pk,c3,c4\n1,1,1\n2,2,2\n3,3,3"
}
@test "sql-server: test CREATE and DROP database via sql-server" {
skiponwindows "Missing dependencies"
cd repo1
start_sql_server repo1
server_query repo1 1 dolt "" "
CREATE DATABASE test;
USE test;
CREATE TABLE pk(pk int primary key);
INSERT INTO pk (pk) VALUES (0);
"
server_query repo1 1 dolt "" "SELECT * FROM test.pk ORDER BY pk" "pk\n0"
server_query repo1 1 dolt "" "DROP DATABASE test" ""
server_query repo1 1 dolt "" "SHOW DATABASES" "Database\ninformation_schema\nmysql\nrepo1"
}
@test "sql-server: DOLT_ADD, DOLT_COMMIT, DOLT_CHECKOUT, DOLT_MERGE work together in server mode" {
skiponwindows "Missing dependencies"
@@ -648,21 +464,6 @@ SQL
server_query repo1 1 dolt "" "SELECT COUNT(*) FROM dolt_log" "COUNT(*)\n3"
}
@test "sql-server: LOAD DATA LOCAL INFILE works" {
skiponwindows "Missing dependencies"
cd repo1
start_sql_server repo1
server_query repo1 1 dolt "" "
CREATE TABLE test(pk int primary key, c1 int, c2 int, c3 int, c4 int, c5 int);
SET GLOBAL local_infile = 1;
LOAD DATA LOCAL INFILE '$BATS_TEST_DIRNAME/helper/1pk5col-ints.csv' INTO TABLE test CHARACTER SET UTF8MB4 FIELDS TERMINATED BY ',' ESCAPED BY '' LINES TERMINATED BY '\n' IGNORE 1 LINES;
"
server_query repo1 1 dolt "" "SELECT * FROM test" "pk,c1,c2,c3,c4,c5\n0,1,2,3,4,5\n1,1,2,3,4,5"
}
@test "sql-server: Run queries on database without ever selecting it" {
skiponwindows "Missing dependencies"
@@ -734,25 +535,6 @@ SQL
[[ "$output" =~ "test" ]] || false
}
@test "sql-server: JSON queries" {
skip_nbf_dolt
cd repo1
start_sql_server repo1
# create table with autocommit on and verify table creation
server_query repo1 1 dolt "" "CREATE TABLE js_test (
pk int NOT NULL,
js json,
PRIMARY KEY (pk)
)" ""
run dolt ls
[ "$status" -eq 0 ]
[[ "$output" =~ "js_test" ]] || false
server_query repo1 1 dolt "" "INSERT INTO js_test VALUES (1, '{\"a\":1}');"
server_query repo1 1 dolt "" "SELECT * FROM js_test;" "pk,js\n1,{\"a\": 1}"
}
@test "sql-server: manual commit table can be dropped (validates superschema structure)" {
skiponwindows "Missing dependencies"
@@ -858,27 +640,6 @@ SQL
server_query "repo1/$hash" 1 dolt "" "select count(*) from test" "count(*)\n3"
}
@test "sql-server: select a branch with the USE syntax" {
skiponwindows "Missing dependencies"
cd repo1
dolt checkout -b "feature-branch"
dolt checkout main
start_sql_server repo1
server_query repo1 1 dolt "" '
USE `repo1/feature-branch`;
CREATE TABLE test (
pk int,
c1 int,
PRIMARY KEY (pk)
)' ""
server_query repo1 1 dolt "" "SHOW tables" "" # no tables on main
server_query "repo1/feature-branch" 1 dolt "" "SHOW Tables" "Tables_in_repo1/feature-branch\ntest"
}
@test "sql-server: SET GLOBAL default branch as ref" {
skiponwindows "Missing dependencies"

View File

@@ -278,7 +278,11 @@ func (s *SqlServer) Restart(newargs *[]string) error {
}
func (s *SqlServer) DB() (*sql.DB, error) {
db, err := sql.Open("mysql", fmt.Sprintf("root@tcp(127.0.0.1:%d)/%s", s.Port, s.DBName))
authority := "root"
location := fmt.Sprintf("tcp(127.0.0.1:%d)", s.Port)
dbname := s.DBName
dsn := fmt.Sprintf("%s@%s/%s?allowAllFiles=true", authority, location, dbname)
db, err := sql.Open("mysql", dsn)
if err != nil {
return nil, err
}

View File

@@ -25,3 +25,7 @@ func TestConfig(t *testing.T) {
func TestCluster(t *testing.T) {
RunTestsFile(t, "tests/sql-server-cluster.yaml")
}
func TestOriginal(t *testing.T) {
RunTestsFile(t, "tests/sql-server-orig.yaml")
}

View File

@@ -0,0 +1,3 @@
pk,c1,c2,c3,c4,c5
0,1,2,3,4,5
1,1,2,3,4,5
1 pk c1 c2 c3 c4 c5
2 0 1 2 3 4 5
3 1 1 2 3 4 5

View File

@@ -39,6 +39,9 @@ type Test struct {
Repos []TestRepo `yaml:"repos"`
MultiRepos []MultiRepo `yaml:"multi_repos"`
Conns []Connection `yaml:"connections"`
// Skip the entire test with this reason.
Skip string `yaml:"skip"`
}
// |Connection| represents a single connection to a sql-server instance defined
@@ -213,6 +216,10 @@ func MakeServer(t *testing.T, dc DoltCmdable, s *Server) (*SqlServer, func()) {
}
func (test Test) Run(t *testing.T) {
if test.Skip != "" {
t.Skip(test.Skip)
}
u, err := NewDoltUser()
require.NoError(t, err)
rs, err := u.MakeRepoStore()
@@ -234,6 +241,10 @@ func (test Test) Run(t *testing.T) {
server.DBName = r.Name
servers[r.Name] = server
defer close()
db, err := server.DB()
require.NoError(t, err)
dbs[r.Name] = db
}
}
for _, mr := range test.MultiRepos {
@@ -253,13 +264,11 @@ func (test Test) Run(t *testing.T) {
if server != nil {
servers[mr.Name] = server
defer close()
}
}
for n, s := range servers {
db, err := s.DB()
require.NoError(t, err)
dbs[n] = db
db, err := server.DB()
require.NoError(t, err)
dbs[mr.Name] = db
}
}
for i, c := range test.Conns {

View File

@@ -0,0 +1,291 @@
tests:
- name: read-only flag prevents modification
repos:
- name: repo1
server:
args: ["--config", "readonly.yaml"]
with_files:
- name: readonly.yaml
contents: |
log_level: trace
behavior:
read_only: true
connections:
- on: repo1
queries:
- query: "show tables"
result:
columns: ["Tables_in_repo1"]
rows: []
- exec: "create table i_should_not_exist (c0 INT)"
error_match: "database server is set to read only mode"
- query: "show tables"
result:
columns: ["Tables_in_repo1"]
rows: []
- name: read-only flag still allows select
repos:
- name: repo1
server: {}
with_files:
- name: readonly.yaml
contents: |
behavior:
read_only: true
connections:
- on: repo1
queries:
- exec: "create table t(c0 int)"
- exec: "insert into t values (1)"
restart_server:
args: ["--config", "readonly.yaml"]
- on: repo1
queries:
- query: "select * from t"
result:
columns: ["c0"]
rows: [["1"]]
- name: read-only flag prevents dolt_commit
skip: read-only flag does not prevent dolt_commit
repos:
- name: repo1
server:
args: ["--config", "readonly.yaml"]
with_files:
- name: readonly.yaml
contents: |
log_level: trace
behavior:
read_only: true
connections:
- on: repo1
queries:
- exec: "call dolt_commit('--allow-empty', '-m', 'msg')"
error_match: "database server is set to read only mode: user does not have permission: write"
- name: read-only flag prevents dolt_reset
skip: read-only flag does not prevent dolt_reset
repos:
- name: repo1
server: {}
with_files:
- name: readonly.yaml
contents: |
log_level: trace
behavior:
read_only: true
connections:
- on: repo1
queries:
- exec: "call dolt_commit('--allow-empty', '-m', 'msg')"
restart_server:
args: ["--config", "readonly.yaml"]
- on: repo1
queries:
- exec: "call dolt_reset('--hard', 'HEAD~1')"
error_match: "database server is set to read only mode: user does not have permission: write"
- name: port in use
repos:
- name: repo1
server: {}
- name: repo2
server:
error_matches:
- "already in use"
- name: test autocommit
repos:
- name: repo1
server: {}
connections:
- on: repo1
queries:
- exec: 'set autocommit=0'
- exec: 'create table t(c0 int)'
- on: repo1
queries:
- query: 'show tables'
result:
columns: ["Tables_in_repo1"]
rows: []
- on: repo1
queries:
- exec: 'create table t(c0 int)'
- on: repo1
queries:
- query: 'show tables'
result:
columns: ["Tables_in_repo1"]
rows: [["t"]]
- name: test basic querying via dolt sql-server
repos:
- name: repo1
server: {}
connections:
- on: repo1
queries:
- query: 'show tables'
result:
columns: ["Tables_in_repo1"]
rows: []
- on: repo1
queries:
- exec: |
CREATE TABLE one_pk (
pk BIGINT NOT NULL COMMENT 'tag:0',
c1 BIGINT COMMENT 'tag:1',
c2 BIGINT COMMENT 'tag:2',
PRIMARY KEY (pk)
)
- on: repo1
queries:
- query: 'show tables'
result:
columns: ["Tables_in_repo1"]
rows: [["one_pk"]]
- on: repo1
queries:
- exec: "INSERT INTO one_pk (pk) VALUES (0)"
- on: repo1
queries:
- query: "SELECT * FROM one_pk ORDER BY pk"
result:
columns: ["pk","c1","c2"]
rows: [["0","NULL","NULL"]]
- on: repo1
queries:
- exec: "INSERT INTO one_pk (pk,c1) VALUES (1,1)"
- on: repo1
queries:
- exec: "INSERT INTO one_pk (pk,c1,c2) VALUES (2,2,2),(3,3,3)"
- on: repo1
queries:
- query: "SELECT * FROM one_pk ORDER BY pk"
result:
columns: ["pk","c1","c2"]
rows:
- ["0","NULL","NULL"]
- ["1","1","NULL"]
- ["2","2","2"]
- ["3","3","3"]
- on: repo1
queries:
- exec: "UPDATE one_pk SET c2=c1 WHERE c2 is NULL and c1 IS NOT NULL"
- name: test multiple queries on same connection
repos:
- name: repo1
server: {}
connections:
- on: repo1
queries:
- exec: |
CREATE TABLE one_pk (
pk BIGINT NOT NULL COMMENT 'tag:0',
c1 BIGINT COMMENT 'tag:1',
c2 BIGINT COMMENT 'tag:2',
PRIMARY KEY (pk)
)
- exec: "INSERT INTO one_pk (pk) VALUES (0)"
- exec: "INSERT INTO one_pk (pk,c1) VALUES (1,1)"
- exec: "INSERT INTO one_pk (pk,c1,c2) VALUES (2,2,2),(3,3,3)"
- query: "SELECT * FROM one_pk ORDER BY pk"
result:
columns: ["pk","c1","c2"]
rows:
- ["0","NULL","NULL"]
- ["1","1","NULL"]
- ["2","2","2"]
- ["3","3","3"]
- on: repo1
queries:
- query: "SELECT * FROM one_pk ORDER BY pk"
result:
columns: ["pk","c1","c2"]
rows:
- ["0","NULL","NULL"]
- ["1","1","NULL"]
- ["2","2","2"]
- ["3","3","3"]
- name: test CREATE and DROP database via sql-server
repos:
- name: repo1
server: {}
connections:
- on: repo1
queries:
- exec: "CREATE DATABASE test"
- exec: "USE test"
- exec: "CREATE TABLE pk(pk int primary key)"
- exec: "INSERT INTO pk (pk) VALUES (0)"
- on: repo1
queries:
- query: "SELECT * FROM test.pk ORDER BY pk"
result:
columns: ["pk"]
rows: [["0"]]
- exec: "drop database test"
- query: "show databases"
result:
columns: ["Database"]
rows:
- ["information_schema"]
- ["mysql"]
- ["repo1"]
- name: LOAD DATA LOCAL INFILE works
repos:
- name: repo1
server: {}
connections:
- on: repo1
queries:
- exec: "CREATE TABLE test(pk int primary key, c1 int, c2 int, c3 int, c4 int, c5 int)"
- exec: "SET GLOBAL local_infile = 1"
- exec: "LOAD DATA LOCAL INFILE 'testdata/1pk5col-ints.csv' INTO TABLE test CHARACTER SET UTF8MB4 FIELDS TERMINATED BY ',' ESCAPED BY '' LINES TERMINATED BY '\n' IGNORE 1 LINES"
- query: "SELECT * FROM test"
result:
columns: ["pk","c1","c2","c3","c4","c5"]
rows:
- ["0","1","2","3","4","5"]
- ["1","1","2","3","4","5"]
- name: JSON queries
repos:
- name: repo1
server: {}
connections:
- on: repo1
queries:
- exec: |
CREATE TABLE js_test (
pk int NOT NULL,
js json,
PRIMARY KEY (pk)
)
- exec: |
INSERT INTO js_test VALUES (1, '{"a":1}')
- query: "SELECT * FROM js_test"
result:
columns: ["pk","js"]
rows: [["1", '{"a":1}']]
- name: select a branch with the USE syntax
repos:
- name: repo1
server: {}
connections:
- on: repo1
queries:
- exec: "call dolt_branch('feature-branch')"
- exec: "use `repo1/feature-branch`"
- exec: |
CREATE TABLE test (
pk int,
c1 int,
PRIMARY KEY (pk)
)
- on: repo1
queries:
- query: "show tables"
result:
columns: ["Tables_in_repo1"]
rows: []
- exec: "use `repo1/feature-branch`"
result:
columns: ["Tables_in_repo1/feature-branch"]
rows: [["test"]]