| // Copyright (c) HashiCorp, Inc. |
| // SPDX-License-Identifier: MPL-2.0 |
| |
| package mysqlhelper |
| |
| import ( |
| "context" |
| "database/sql" |
| "fmt" |
| "os" |
| "strings" |
| "testing" |
| |
| "github.com/hashicorp/vault/sdk/helper/docker" |
| ) |
| |
| type Config struct { |
| docker.ServiceHostPort |
| ConnString string |
| } |
| |
| var _ docker.ServiceConfig = &Config{} |
| |
| func PrepareTestContainer(t *testing.T, legacy bool, pw string) (func(), string) { |
| if os.Getenv("MYSQL_URL") != "" { |
| return func() {}, os.Getenv("MYSQL_URL") |
| } |
| |
| imageVersion := "5.7" |
| if legacy { |
| imageVersion = "5.6" |
| } |
| |
| runner, err := docker.NewServiceRunner(docker.RunOptions{ |
| ContainerName: "mysql", |
| ImageRepo: "docker.mirror.hashicorp.services/library/mysql", |
| ImageTag: imageVersion, |
| Ports: []string{"3306/tcp"}, |
| Env: []string{"MYSQL_ROOT_PASSWORD=" + pw}, |
| }) |
| if err != nil { |
| t.Fatalf("could not start docker mysql: %s", err) |
| } |
| |
| svc, err := runner.StartService(context.Background(), func(ctx context.Context, host string, port int) (docker.ServiceConfig, error) { |
| hostIP := docker.NewServiceHostPort(host, port) |
| connString := fmt.Sprintf("root:%s@tcp(%s)/mysql?parseTime=true", pw, hostIP.Address()) |
| db, err := sql.Open("mysql", connString) |
| if err != nil { |
| return nil, err |
| } |
| defer db.Close() |
| err = db.Ping() |
| if err != nil { |
| return nil, err |
| } |
| return &Config{ServiceHostPort: *hostIP, ConnString: connString}, nil |
| }) |
| if err != nil { |
| t.Fatalf("could not start docker mysql: %s", err) |
| } |
| return svc.Cleanup, svc.Config.(*Config).ConnString |
| } |
| |
| func TestCredsExist(t testing.TB, connURL, username, password string) error { |
| // Log in with the new creds |
| connURL = strings.Replace(connURL, "root:secret", fmt.Sprintf("%s:%s", username, password), 1) |
| db, err := sql.Open("mysql", connURL) |
| if err != nil { |
| return err |
| } |
| defer db.Close() |
| return db.Ping() |
| } |