2023-05-21 19:37:59 +03:00
|
|
|
package db
|
2021-05-09 11:12:05 -04:00
|
|
|
|
|
|
|
|
import (
|
2023-11-19 22:37:04 +01:00
|
|
|
"log"
|
2024-11-23 11:19:52 +01:00
|
|
|
"net/url"
|
2021-05-09 11:12:05 -04:00
|
|
|
"os"
|
2024-11-23 11:19:52 +01:00
|
|
|
"strconv"
|
|
|
|
|
"strings"
|
2021-05-09 11:12:05 -04:00
|
|
|
"testing"
|
|
|
|
|
|
2024-02-09 07:27:00 +01:00
|
|
|
"github.com/juanfont/headscale/hscontrol/types"
|
2024-11-23 11:19:52 +01:00
|
|
|
"zombiezen.com/go/postgrestest"
|
2021-05-09 11:12:05 -04:00
|
|
|
)
|
|
|
|
|
|
2024-11-23 11:19:52 +01:00
|
|
|
func newSQLiteTestDB() (*HSDatabase, error) {
|
2026-01-16 16:32:36 +00:00
|
|
|
tmpDir, err := os.MkdirTemp("", "headscale-db-test-*")
|
2024-07-18 10:01:59 +02:00
|
|
|
if err != nil {
|
|
|
|
|
return nil, err
|
|
|
|
|
}
|
2023-05-11 09:09:18 +02:00
|
|
|
|
2023-11-19 22:37:04 +01:00
|
|
|
log.Printf("database path: %s", tmpDir+"/headscale_test.db")
|
|
|
|
|
|
2026-01-16 16:32:36 +00:00
|
|
|
db, err := NewHeadscaleDatabase(
|
2026-01-21 19:40:29 +05:30
|
|
|
&types.Config{
|
|
|
|
|
Database: types.DatabaseConfig{
|
|
|
|
|
Type: types.DatabaseSqlite,
|
|
|
|
|
Sqlite: types.SqliteConfig{
|
|
|
|
|
Path: tmpDir + "/headscale_test.db",
|
|
|
|
|
},
|
|
|
|
|
},
|
|
|
|
|
Policy: types.PolicyConfig{
|
|
|
|
|
Mode: types.PolicyModeDB,
|
2024-02-09 07:27:00 +01:00
|
|
|
},
|
|
|
|
|
},
|
2023-05-11 09:09:18 +02:00
|
|
|
)
|
2021-07-04 21:40:46 +02:00
|
|
|
if err != nil {
|
2024-07-18 10:01:59 +02:00
|
|
|
return nil, err
|
2021-07-04 21:40:46 +02:00
|
|
|
}
|
2024-07-18 10:01:59 +02:00
|
|
|
|
|
|
|
|
return db, nil
|
2021-05-09 11:12:05 -04:00
|
|
|
}
|
2024-11-23 11:19:52 +01:00
|
|
|
|
|
|
|
|
func newPostgresTestDB(t *testing.T) *HSDatabase {
|
|
|
|
|
t.Helper()
|
|
|
|
|
|
2025-01-23 14:58:42 +01:00
|
|
|
return newHeadscaleDBFromPostgresURL(t, newPostgresDBForTest(t))
|
|
|
|
|
}
|
2024-11-23 11:19:52 +01:00
|
|
|
|
2025-01-23 14:58:42 +01:00
|
|
|
func newPostgresDBForTest(t *testing.T) *url.URL {
|
|
|
|
|
t.Helper()
|
2024-11-23 11:19:52 +01:00
|
|
|
|
2025-05-21 11:08:33 +02:00
|
|
|
ctx := t.Context()
|
2026-02-06 21:45:32 +01:00
|
|
|
|
2024-11-23 11:19:52 +01:00
|
|
|
srv, err := postgrestest.Start(ctx)
|
|
|
|
|
if err != nil {
|
2026-03-10 15:06:41 +00:00
|
|
|
t.Skipf("start postgres: %s", err)
|
2024-11-23 11:19:52 +01:00
|
|
|
}
|
2026-02-06 21:45:32 +01:00
|
|
|
|
2024-11-23 11:19:52 +01:00
|
|
|
t.Cleanup(srv.Cleanup)
|
|
|
|
|
|
|
|
|
|
u, err := srv.CreateDatabase(ctx)
|
|
|
|
|
if err != nil {
|
|
|
|
|
t.Fatal(err)
|
|
|
|
|
}
|
2026-02-06 21:45:32 +01:00
|
|
|
|
2024-11-23 11:19:52 +01:00
|
|
|
t.Logf("created local postgres: %s", u)
|
|
|
|
|
pu, _ := url.Parse(u)
|
|
|
|
|
|
2025-01-23 14:58:42 +01:00
|
|
|
return pu
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
func newHeadscaleDBFromPostgresURL(t *testing.T, pu *url.URL) *HSDatabase {
|
|
|
|
|
t.Helper()
|
|
|
|
|
|
2024-11-23 11:19:52 +01:00
|
|
|
pass, _ := pu.User.Password()
|
|
|
|
|
port, _ := strconv.Atoi(pu.Port())
|
|
|
|
|
|
2025-01-23 14:58:42 +01:00
|
|
|
db, err := NewHeadscaleDatabase(
|
2026-01-21 19:40:29 +05:30
|
|
|
&types.Config{
|
|
|
|
|
Database: types.DatabaseConfig{
|
|
|
|
|
Type: types.DatabasePostgres,
|
|
|
|
|
Postgres: types.PostgresConfig{
|
|
|
|
|
Host: pu.Hostname(),
|
|
|
|
|
User: pu.User.Username(),
|
|
|
|
|
Name: strings.TrimLeft(pu.Path, "/"),
|
|
|
|
|
Pass: pass,
|
|
|
|
|
Port: port,
|
|
|
|
|
Ssl: "disable",
|
|
|
|
|
},
|
|
|
|
|
},
|
|
|
|
|
Policy: types.PolicyConfig{
|
|
|
|
|
Mode: types.PolicyModeDB,
|
2024-11-23 11:19:52 +01:00
|
|
|
},
|
|
|
|
|
},
|
|
|
|
|
)
|
|
|
|
|
if err != nil {
|
|
|
|
|
t.Fatal(err)
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return db
|
|
|
|
|
}
|