vitess.io/vitess@v0.16.2/go/test/endtoend/docker/vttestserver_test.go (about)

     1  /*
     2  Copyright 2021 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 docker
    18  
    19  import (
    20  	"context"
    21  	"fmt"
    22  	"os"
    23  	"testing"
    24  
    25  	"vitess.io/vitess/go/test/endtoend/utils"
    26  
    27  	"vitess.io/vitess/go/mysql"
    28  
    29  	"github.com/stretchr/testify/require"
    30  )
    31  
    32  func TestMain(m *testing.M) {
    33  	exitCode := func() int {
    34  		err := makeVttestserverDockerImages()
    35  		if err != nil {
    36  			return 1
    37  		}
    38  		return m.Run()
    39  	}()
    40  	os.Exit(exitCode)
    41  }
    42  
    43  func TestUnsharded(t *testing.T) {
    44  	dockerImages := []string{vttestserverMysql57image, vttestserverMysql80image}
    45  	for _, image := range dockerImages {
    46  		t.Run(image, func(t *testing.T) {
    47  			vtest := newVttestserver(image, []string{"unsharded_ks"}, []int{1}, 1000, 33577)
    48  			err := vtest.startDockerImage()
    49  			require.NoError(t, err)
    50  			defer vtest.teardown()
    51  
    52  			// wait for the docker to be setup
    53  			err = vtest.waitUntilDockerHealthy(10)
    54  			require.NoError(t, err)
    55  
    56  			ctx := context.Background()
    57  			vttestParams := mysql.ConnParams{
    58  				Host: "localhost",
    59  				Port: vtest.port,
    60  			}
    61  			conn, err := mysql.Connect(ctx, &vttestParams)
    62  			require.NoError(t, err)
    63  			defer conn.Close()
    64  			utils.AssertMatches(t, conn, "show databases", `[[VARCHAR("unsharded_ks")] [VARCHAR("information_schema")] [VARCHAR("mysql")] [VARCHAR("sys")] [VARCHAR("performance_schema")]]`)
    65  			utils.Exec(t, conn, "create table unsharded_ks.t1(id int)")
    66  			utils.Exec(t, conn, "insert into unsharded_ks.t1(id) values (10),(20),(30)")
    67  			utils.AssertMatches(t, conn, "select * from unsharded_ks.t1", `[[INT32(10)] [INT32(20)] [INT32(30)]]`)
    68  		})
    69  	}
    70  }
    71  
    72  func TestSharded(t *testing.T) {
    73  	dockerImages := []string{vttestserverMysql57image, vttestserverMysql80image}
    74  	for _, image := range dockerImages {
    75  		t.Run(image, func(t *testing.T) {
    76  			vtest := newVttestserver(image, []string{"ks"}, []int{2}, 1000, 33577)
    77  			err := vtest.startDockerImage()
    78  			require.NoError(t, err)
    79  			defer vtest.teardown()
    80  
    81  			// wait for the docker to be setup
    82  			err = vtest.waitUntilDockerHealthy(10)
    83  			require.NoError(t, err)
    84  
    85  			ctx := context.Background()
    86  			vttestParams := mysql.ConnParams{
    87  				Host: "localhost",
    88  				Port: vtest.port,
    89  			}
    90  			conn, err := mysql.Connect(ctx, &vttestParams)
    91  			require.NoError(t, err)
    92  			defer conn.Close()
    93  			utils.AssertMatches(t, conn, "show databases", `[[VARCHAR("ks")] [VARCHAR("information_schema")] [VARCHAR("mysql")] [VARCHAR("sys")] [VARCHAR("performance_schema")]]`)
    94  			utils.Exec(t, conn, "create table ks.t1(id int)")
    95  			utils.Exec(t, conn, "alter vschema on ks.t1 add vindex `binary_md5`(id) using `binary_md5`")
    96  			utils.Exec(t, conn, "insert into ks.t1(id) values (10),(20),(30)")
    97  			utils.AssertMatches(t, conn, "select id from ks.t1 order by id", `[[INT32(10)] [INT32(20)] [INT32(30)]]`)
    98  		})
    99  	}
   100  }
   101  
   102  func TestMysqlMaxCons(t *testing.T) {
   103  	dockerImages := []string{vttestserverMysql57image, vttestserverMysql80image}
   104  	for _, image := range dockerImages {
   105  		t.Run(image, func(t *testing.T) {
   106  			vtest := newVttestserver(image, []string{"ks"}, []int{2}, 100000, 33577)
   107  			err := vtest.startDockerImage()
   108  			require.NoError(t, err)
   109  			defer vtest.teardown()
   110  
   111  			// wait for the docker to be setup
   112  			err = vtest.waitUntilDockerHealthy(10)
   113  			require.NoError(t, err)
   114  
   115  			ctx := context.Background()
   116  			vttestParams := mysql.ConnParams{
   117  				Host: "localhost",
   118  				Port: vtest.port,
   119  			}
   120  			conn, err := mysql.Connect(ctx, &vttestParams)
   121  			require.NoError(t, err)
   122  			defer conn.Close()
   123  			utils.AssertMatches(t, conn, "select @@max_connections", `[[UINT64(100000)]]`)
   124  		})
   125  	}
   126  }
   127  
   128  func TestLargeNumberOfKeyspaces(t *testing.T) {
   129  	dockerImages := []string{vttestserverMysql57image, vttestserverMysql80image}
   130  	for _, image := range dockerImages {
   131  		t.Run(image, func(t *testing.T) {
   132  			var keyspaces []string
   133  			var numShards []int
   134  			for i := 0; i < 100; i++ {
   135  				keyspaces = append(keyspaces, fmt.Sprintf("unsharded_ks%d", i))
   136  				numShards = append(numShards, 1)
   137  			}
   138  
   139  			vtest := newVttestserver(image, keyspaces, numShards, 100000, 33577)
   140  			err := vtest.startDockerImage()
   141  			require.NoError(t, err)
   142  			defer vtest.teardown()
   143  
   144  			// wait for the docker to be setup
   145  			err = vtest.waitUntilDockerHealthy(15)
   146  			require.NoError(t, err)
   147  
   148  			ctx := context.Background()
   149  			vttestParams := mysql.ConnParams{
   150  				Host: "localhost",
   151  				Port: vtest.port,
   152  			}
   153  			conn, err := mysql.Connect(ctx, &vttestParams)
   154  			require.NoError(t, err)
   155  			defer conn.Close()
   156  
   157  			// assert that all the keyspaces are correctly setup
   158  			for _, keyspace := range keyspaces {
   159  				utils.Exec(t, conn, "create table "+keyspace+".t1(id int)")
   160  				utils.Exec(t, conn, "insert into "+keyspace+".t1(id) values (10),(20),(30)")
   161  				utils.AssertMatches(t, conn, "select * from "+keyspace+".t1", `[[INT32(10)] [INT32(20)] [INT32(30)]]`)
   162  			}
   163  		})
   164  	}
   165  }