Files
trufflehog/pkg/detectors/jdbc/mysql_integration_test.go
Miccah ddc81bd7c1 [THOG-162] Implement JDBC verification for select drivers (#792)
* [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
2022-09-21 17:50:48 +02:00

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()
}