* [THOG-162] Implement JDBC verification for select drivers Also includes integration tests for postgres and mysql via docker. To run, execute the following (untested what will happen if the docker images aren't installed): go test -tags=detectors,integration ./pkg/detectors/jdbc * Make jdbc regex a bit more strict * Surface the context to allow the caller to set a timeout
96 lines
2.0 KiB
Go
96 lines
2.0 KiB
Go
//go:build detectors && integration
|
|
// +build detectors,integration
|
|
|
|
package jdbc
|
|
|
|
import (
|
|
"bytes"
|
|
"context"
|
|
"errors"
|
|
"os/exec"
|
|
"testing"
|
|
"time"
|
|
|
|
"github.com/stretchr/testify/assert"
|
|
)
|
|
|
|
const (
|
|
mysqlUser = "coolGuy"
|
|
mysqlPass = "23201dabb56ca236f3dc6736c0f9afad"
|
|
mysqlDatabase = "stuff"
|
|
)
|
|
|
|
func TestMySQL(t *testing.T) {
|
|
tests := []struct {
|
|
input string
|
|
wantErr bool
|
|
wantPing bool
|
|
}{
|
|
{
|
|
input: "",
|
|
wantErr: true,
|
|
},
|
|
{
|
|
input: "//" + mysqlUser + ":" + mysqlPass + "@tcp(127.0.0.1:3306)/" + mysqlDatabase,
|
|
wantPing: true,
|
|
},
|
|
{
|
|
input: "//wrongUser:wrongPass@tcp(127.0.0.1:3306)/" + mysqlDatabase,
|
|
wantPing: false,
|
|
},
|
|
{
|
|
input: "//" + mysqlUser + ":wrongPass@tcp(127.0.0.1:3306)/" + mysqlDatabase,
|
|
wantPing: false,
|
|
},
|
|
{
|
|
input: "//" + mysqlUser + ":" + mysqlPass + "@tcp(127.0.0.1:3306)/",
|
|
wantPing: true,
|
|
},
|
|
{
|
|
input: "//" + mysqlUser + ":" + mysqlPass + "@tcp(127.0.0.1:3306)/wrongDB",
|
|
wantPing: true,
|
|
},
|
|
}
|
|
for _, tt := range tests {
|
|
t.Run(tt.input, func(t *testing.T) {
|
|
j, err := parseMySQL(tt.input)
|
|
if tt.wantErr {
|
|
assert.Error(t, err)
|
|
return
|
|
}
|
|
assert.NoError(t, err)
|
|
assert.Equal(t, tt.wantPing, j.ping(context.Background()))
|
|
})
|
|
}
|
|
}
|
|
|
|
var mysqlDockerHash string
|
|
|
|
func startMySQL() error {
|
|
cmd := exec.Command(
|
|
"docker", "run", "--rm", "-p", "3306:3306",
|
|
"-e", "MYSQL_ROOT_PASSWORD=403a96cff2a323f74bfb1c16992895be",
|
|
"-e", "MYSQL_USER="+mysqlUser,
|
|
"-e", "MYSQL_PASSWORD="+mysqlPass,
|
|
"-e", "MYSQL_DATABASE="+mysqlDatabase,
|
|
"-e", "MYSQL_ROOT_HOST=%",
|
|
"-d", "mysql",
|
|
)
|
|
out, err := cmd.Output()
|
|
if err != nil {
|
|
return err
|
|
}
|
|
mysqlDockerHash = string(bytes.TrimSpace(out))
|
|
select {
|
|
case <-dockerLogLine(mysqlDockerHash, "socket: '/var/run/mysqld/mysqld.sock' port: 3306"):
|
|
return nil
|
|
case <-time.After(30 * time.Second):
|
|
stopMySQL()
|
|
return errors.New("timeout waiting for mysql database to be ready")
|
|
}
|
|
}
|
|
|
|
func stopMySQL() {
|
|
exec.Command("docker", "kill", mysqlDockerHash).Run()
|
|
}
|