diff --git a/endtoend/framework/connection_utils.go b/endtoend/framework/connection_utils.go new file mode 100644 index 0000000000..157b76e08e --- /dev/null +++ b/endtoend/framework/connection_utils.go @@ -0,0 +1,36 @@ +package framework + +import ( + "database/sql" + "fmt" + "github.com/go-sql-driver/mysql" + "time" +) + +func newMysqlConfig(host string, port int, user string, passwd string, dbName string) *mysql.Config { + return &mysql.Config{ + Net: "tcp", + Addr: fmt.Sprintf("%s:%d", host, port), + User: user, + Passwd: passwd, + ParseTime: true, + Loc: time.Local, + AllowNativePasswords: true, + DBName: dbName, + } +} + +func newMysqlConnectionPool(host string, port int, user string, passwd string, dbName string) (*sql.DB, error) { + c := newMysqlConfig(host, port, user, passwd, dbName) + db, err := sql.Open("mysql", c.FormatDSN()) + if err != nil { + return nil, err + } + + if err := db.Ping(); err != nil { + db.Close() + return nil, err + } + + return db, nil +} diff --git a/endtoend/framework/single_node_cluster.go b/endtoend/framework/single_node_cluster.go new file mode 100644 index 0000000000..0d3d2bbb50 --- /dev/null +++ b/endtoend/framework/single_node_cluster.go @@ -0,0 +1,72 @@ +package framework + +import ( + "database/sql" + "flag" +) + +var ( + mysqlHost = "127.0.0.1" + mysqlPort = 3306 + mysqlUser = "root" + mysqlPasswd = "passwd" + + wescaleHost = "127.0.0.1" + wescalePort = 15306 + wescaleUser = "root" + wescalePasswd = "passwd" +) + +func init() { + RegisterFlagsForSingleNodeCluster() +} + +func RegisterFlagsForSingleNodeCluster() { + flag.StringVar(&mysqlHost, "mysqlHost", mysqlHost, "Host of the MySQL server") + flag.IntVar(&mysqlPort, "mysqlPort", mysqlPort, "Port of the MySQL server") + flag.StringVar(&mysqlUser, "mysqlUser", mysqlUser, "User for the MySQL server") + flag.StringVar(&mysqlPasswd, "mysqlPasswd", mysqlPasswd, "Password for the MySQL server") + + flag.StringVar(&wescaleHost, "wescaleHost", wescaleHost, "Host of the WeScale server") + flag.IntVar(&wescalePort, "wescalePort", wescalePort, "Port of the WeScale server") + flag.StringVar(&wescaleUser, "wescaleUser", wescaleUser, "User for the WeScale server") + flag.StringVar(&wescalePasswd, "wescalePasswd", wescalePasswd, "Password for the WeScale server") +} + +type SingleNodeCluster struct { + MysqlDb *sql.DB + WescaleDb *sql.DB +} + +func SetUpSingleNodeCluster() (*SingleNodeCluster, error) { + mysqlDb, err := newMysqlConnectionPool(mysqlHost, mysqlPort, mysqlUser, mysqlPasswd, "") + if err != nil { + return nil, err + } + + wescaleDb, err := newMysqlConnectionPool(wescaleHost, wescalePort, wescaleUser, wescalePasswd, "") + if err != nil { + return nil, err + } + + return &SingleNodeCluster{ + MysqlDb: mysqlDb, + WescaleDb: wescaleDb, + }, nil +} + +func (c *SingleNodeCluster) TearDownSingleNodeCluster() error { + if c.MysqlDb != nil { + err := c.MysqlDb.Close() + if err != nil { + return err + } + } + if c.WescaleDb != nil { + err := c.WescaleDb.Close() + if err != nil { + return err + } + } + return nil +} diff --git a/endtoend/framework/sql_utils.go b/endtoend/framework/sql_utils.go new file mode 100644 index 0000000000..7c02975570 --- /dev/null +++ b/endtoend/framework/sql_utils.go @@ -0,0 +1,21 @@ +package framework + +import ( + "database/sql" + "fmt" +) + +func CreateDatabaseIfNotExists(db *sql.DB, dbName string) error { + _, err := db.Exec(fmt.Sprintf("CREATE DATABASE IF NOT EXISTS `%s`", dbName)) + return err +} + +func DropDatabaseIfExists(db *sql.DB, dbName string) error { + _, err := db.Exec(fmt.Sprintf("DROP DATABASE IF EXISTS `%s`", dbName)) + return err +} + +func ExecuteSqlScript(db *sql.DB, sqlScript string) error { + _, err := db.Exec(sqlScript) + return err +} diff --git a/endtoend/wasm/cleanup.sql b/endtoend/wasm/cleanup.sql new file mode 100644 index 0000000000..ed85b07f9a --- /dev/null +++ b/endtoend/wasm/cleanup.sql @@ -0,0 +1 @@ +drop database if exists wasm_e2e_test; \ No newline at end of file diff --git a/endtoend/wasm/main_test.go b/endtoend/wasm/main_test.go new file mode 100644 index 0000000000..6c739cab44 --- /dev/null +++ b/endtoend/wasm/main_test.go @@ -0,0 +1,64 @@ +package wasm + +import ( + _ "embed" + "log" + "os" + "testing" + "vitess.io/vitess/endtoend/framework" +) + +//go:embed setup.sql +var setupSql string + +//go:embed cleanup.sql +var cleanupSql string + +var cluster *framework.SingleNodeCluster + +func setup() error { + var err error + cluster, err = framework.SetUpSingleNodeCluster() + if err != nil { + return err + } + + err = framework.ExecuteSqlScript(cluster.WescaleDb, setupSql) + if err != nil { + cluster.TearDownSingleNodeCluster() + return err + } + + return nil +} + +func cleanup() error { + if err := framework.ExecuteSqlScript(cluster.WescaleDb, cleanupSql); err != nil { + return err + } + if err := cluster.TearDownSingleNodeCluster(); err != nil { + return err + } + return nil +} + +func TestMain(m *testing.M) { + // Setup the test environment + if err := setup(); err != nil { + log.Printf("Setup failed: %v", err) + os.Exit(1) + } + + // Run the tests + code := m.Run() + + // Cleanup the test environment + if err := cleanup(); err != nil { + log.Printf("Cleanup failed: %v", err) + if code == 0 { + os.Exit(1) + } + } + + os.Exit(code) +} diff --git a/endtoend/wasm/setup.sql b/endtoend/wasm/setup.sql new file mode 100644 index 0000000000..ca40e6802d --- /dev/null +++ b/endtoend/wasm/setup.sql @@ -0,0 +1,2 @@ +create database if not exists wasm_e2e_test; + diff --git a/endtoend/wasm/wasm_test.go b/endtoend/wasm/wasm_test.go new file mode 100644 index 0000000000..51e0febaa5 --- /dev/null +++ b/endtoend/wasm/wasm_test.go @@ -0,0 +1,11 @@ +package wasm + +import ( + "github.com/stretchr/testify/assert" + "testing" +) + +func TestCreateWasmFilter(t *testing.T) { + assert.NoError(t, cluster.MysqlDb.Ping()) + assert.NoError(t, cluster.WescaleDb.Ping()) +}