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  }