From 153ea002e47b5dac2630fb91ca5e5c2e96dbbb3d Mon Sep 17 00:00:00 2001 From: Aaron Son Date: Mon, 3 Oct 2022 14:00:56 -0700 Subject: [PATCH] integration-tests/go-sql-server-driver: Start migrating over some simple tests from sql-server.bats. --- integration-tests/bats/sql-server.bats | 239 -------------- integration-tests/go-sql-server-driver/cmd.go | 6 +- .../go-sql-server-driver/main_test.go | 4 + .../testdata/1pk5col-ints.csv | 3 + .../go-sql-server-driver/testdef.go | 21 +- .../tests/sql-server-orig.yaml | 291 ++++++++++++++++++ 6 files changed, 318 insertions(+), 246 deletions(-) create mode 100644 integration-tests/go-sql-server-driver/testdata/1pk5col-ints.csv create mode 100644 integration-tests/go-sql-server-driver/tests/sql-server-orig.yaml diff --git a/integration-tests/bats/sql-server.bats b/integration-tests/bats/sql-server.bats index 713003aedf..e41bb01e33 100644 --- a/integration-tests/bats/sql-server.bats +++ b/integration-tests/bats/sql-server.bats @@ -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" diff --git a/integration-tests/go-sql-server-driver/cmd.go b/integration-tests/go-sql-server-driver/cmd.go index 8bfb386638..e0461dfb46 100644 --- a/integration-tests/go-sql-server-driver/cmd.go +++ b/integration-tests/go-sql-server-driver/cmd.go @@ -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 } diff --git a/integration-tests/go-sql-server-driver/main_test.go b/integration-tests/go-sql-server-driver/main_test.go index 80e26dd955..f585ba9b30 100644 --- a/integration-tests/go-sql-server-driver/main_test.go +++ b/integration-tests/go-sql-server-driver/main_test.go @@ -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") +} diff --git a/integration-tests/go-sql-server-driver/testdata/1pk5col-ints.csv b/integration-tests/go-sql-server-driver/testdata/1pk5col-ints.csv new file mode 100644 index 0000000000..a745f5306e --- /dev/null +++ b/integration-tests/go-sql-server-driver/testdata/1pk5col-ints.csv @@ -0,0 +1,3 @@ +pk,c1,c2,c3,c4,c5 +0,1,2,3,4,5 +1,1,2,3,4,5 diff --git a/integration-tests/go-sql-server-driver/testdef.go b/integration-tests/go-sql-server-driver/testdef.go index 67c606f493..58ab0cc955 100644 --- a/integration-tests/go-sql-server-driver/testdef.go +++ b/integration-tests/go-sql-server-driver/testdef.go @@ -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 { diff --git a/integration-tests/go-sql-server-driver/tests/sql-server-orig.yaml b/integration-tests/go-sql-server-driver/tests/sql-server-orig.yaml new file mode 100644 index 0000000000..120f2becbe --- /dev/null +++ b/integration-tests/go-sql-server-driver/tests/sql-server-orig.yaml @@ -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"]]