// Copyright 2017 The Go Authors.  All rights reserved.
// Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file.

//go:build cloud && !plan9
// +build cloud,!plan9

package dbtest

import (
	"crypto/rand"
	"database/sql"
	"encoding/base64"
	"flag"
	"fmt"
	"testing"

	_ "github.com/GoogleCloudPlatform/cloudsql-proxy/proxy/dialers/mysql"
)

var cloud = flag.Bool("cloud", false, "connect to Cloud SQL database instead of in-memory SQLite")
var cloudsql = flag.String("cloudsql", "golang-org:us-central1:golang-org", "name of Cloud SQL instance to run tests on")

// createEmptyDB makes a new, empty database for the test.
func createEmptyDB(t *testing.T) (driver, dsn string, cleanup func()) {
	if !*cloud {
		return "sqlite3", ":memory:", nil
	}
	buf := make([]byte, 6)
	if _, err := rand.Read(buf); err != nil {
		t.Fatal(err)
	}

	name := "perfdata-test-" + base64.RawURLEncoding.EncodeToString(buf)

	prefix := fmt.Sprintf("root:@cloudsql(%s)/", *cloudsql)

	db, err := sql.Open("mysql", prefix)
	if err != nil {
		t.Fatal(err)
	}

	if _, err := db.Exec(fmt.Sprintf("CREATE DATABASE `%s`", name)); err != nil {
		db.Close()
		t.Fatal(err)
	}

	t.Logf("Using database %q", name)

	return "mysql", prefix + name + "?interpolateParams=true", func() {
		if _, err := db.Exec(fmt.Sprintf("DROP DATABASE `%s`", name)); err != nil {
			t.Error(err)
		}
		db.Close()
	}
}
