vitess.io/vitess@v0.16.2/go/test/endtoend/vtgate/vschema/vschema_test.go (about) 1 /* 2 Copyright 2019 The Vitess Authors. 3 4 Licensed under the Apache License, Version 2.0 (the "License"); 5 you may not use this file except in compliance with the License. 6 You may obtain a copy of the License at 7 8 http://www.apache.org/licenses/LICENSE-2.0 9 10 Unless required by applicable law or agreed to in writing, software 11 distributed under the License is distributed on an "AS IS" BASIS, 12 WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 See the License for the specific language governing permissions and 14 limitations under the License. 15 */ 16 17 package vschema 18 19 import ( 20 "context" 21 "flag" 22 "fmt" 23 "os" 24 "testing" 25 26 "vitess.io/vitess/go/test/endtoend/utils" 27 28 "github.com/stretchr/testify/require" 29 30 "vitess.io/vitess/go/mysql" 31 "vitess.io/vitess/go/test/endtoend/cluster" 32 ) 33 34 var ( 35 clusterInstance *cluster.LocalProcessCluster 36 vtParams mysql.ConnParams 37 hostname = "localhost" 38 keyspaceName = "ks" 39 cell = "zone1" 40 sqlSchema = ` 41 create table vt_user ( 42 id bigint, 43 name varchar(64), 44 primary key (id) 45 ) Engine=InnoDB; 46 47 create table main ( 48 id bigint, 49 val varchar(128), 50 primary key(id) 51 ) Engine=InnoDB; 52 ` 53 ) 54 55 func TestMain(m *testing.M) { 56 defer cluster.PanicHandler(nil) 57 flag.Parse() 58 59 exitcode, err := func() (int, error) { 60 clusterInstance = cluster.NewCluster(cell, hostname) 61 defer clusterInstance.Teardown() 62 63 // Start topo server 64 if err := clusterInstance.StartTopo(); err != nil { 65 return 1, err 66 } 67 68 // List of users authorized to execute vschema ddl operations 69 clusterInstance.VtGateExtraArgs = []string{"--vschema_ddl_authorized_users=%", "--schema_change_signal=false"} 70 71 // Start keyspace 72 keyspace := &cluster.Keyspace{ 73 Name: keyspaceName, 74 SchemaSQL: sqlSchema, 75 } 76 if err := clusterInstance.StartUnshardedKeyspace(*keyspace, 0, false); err != nil { 77 return 1, err 78 } 79 80 // Start vtgate 81 if err := clusterInstance.StartVtgate(); err != nil { 82 return 1, err 83 } 84 vtParams = mysql.ConnParams{ 85 Host: clusterInstance.Hostname, 86 Port: clusterInstance.VtgateMySQLPort, 87 } 88 return m.Run(), nil 89 }() 90 if err != nil { 91 fmt.Printf("%v\n", err) 92 os.Exit(1) 93 } else { 94 os.Exit(exitcode) 95 } 96 97 } 98 99 func TestVSchema(t *testing.T) { 100 defer cluster.PanicHandler(t) 101 ctx := context.Background() 102 conn, err := mysql.Connect(ctx, &vtParams) 103 require.NoError(t, err) 104 defer conn.Close() 105 106 // Test the empty database with no vschema 107 utils.Exec(t, conn, "insert into vt_user (id,name) values(1,'test1'), (2,'test2'), (3,'test3'), (4,'test4')") 108 109 utils.AssertMatches(t, conn, "select id, name from vt_user order by id", 110 `[[INT64(1) VARCHAR("test1")] [INT64(2) VARCHAR("test2")] [INT64(3) VARCHAR("test3")] [INT64(4) VARCHAR("test4")]]`) 111 112 utils.AssertMatches(t, conn, "delete from vt_user", `[]`) 113 114 vtgateVersion, err := cluster.GetMajorVersion("vtgate") 115 require.NoError(t, err) 116 117 // Test empty vschema 118 if vtgateVersion >= 17 { 119 utils.AssertMatches(t, conn, "SHOW VSCHEMA TABLES", `[]`) 120 } else { 121 utils.AssertMatches(t, conn, "SHOW VSCHEMA TABLES", `[[VARCHAR("dual")]]`) 122 } 123 124 // Use the DDL to create an unsharded vschema and test again 125 126 // Create VSchema and do a Select to force update VSCHEMA 127 utils.Exec(t, conn, "begin") 128 utils.Exec(t, conn, "ALTER VSCHEMA ADD TABLE vt_user") 129 utils.Exec(t, conn, "select * from vt_user") 130 utils.Exec(t, conn, "commit") 131 132 utils.Exec(t, conn, "begin") 133 utils.Exec(t, conn, "ALTER VSCHEMA ADD TABLE main") 134 utils.Exec(t, conn, "select * from main") 135 utils.Exec(t, conn, "commit") 136 137 // Test Showing Tables 138 if vtgateVersion >= 17 { 139 utils.AssertMatches(t, conn, "SHOW VSCHEMA TABLES", `[[VARCHAR("main")] [VARCHAR("vt_user")]]`) 140 } else { 141 utils.AssertMatches(t, conn, "SHOW VSCHEMA TABLES", `[[VARCHAR("dual")] [VARCHAR("main")] [VARCHAR("vt_user")]]`) 142 } 143 144 // Test Showing Vindexes 145 utils.AssertMatches(t, conn, "SHOW VSCHEMA VINDEXES", `[]`) 146 147 // Test DML operations 148 utils.Exec(t, conn, "insert into vt_user (id,name) values(1,'test1'), (2,'test2'), (3,'test3'), (4,'test4')") 149 utils.AssertMatches(t, conn, "select id, name from vt_user order by id", 150 `[[INT64(1) VARCHAR("test1")] [INT64(2) VARCHAR("test2")] [INT64(3) VARCHAR("test3")] [INT64(4) VARCHAR("test4")]]`) 151 152 utils.AssertMatches(t, conn, "delete from vt_user", `[]`) 153 154 }