//go:build linux && rootrunner
package host
import (
"database/sql"
"encoding/json"
"io"
"net"
"net/http"
"net/url"
"sync/atomic"
"testing"
"time"
"github.com/carlosframework/platform/internal/provision"
)
func plan14WoodstarProgram(t *testing.T, host, endpoint string) (claimUnitProgram, func(*http.Client)) {
t.Helper()
ln, err := net.Listen("tcp", "127.0.0.1:0")
if err != nil {
t.Fatal(err)
}
var contacted atomic.Int64
srv := &http.Server{Handler: http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
contacted.Add(1)
io.WriteString(w, `
runner upstream`)
})}
go srv.Serve(ln)
t.Cleanup(func() { srv.Close() })
upstream := "http://" + ln.Addr().String()
dbPath := provision.NestedDBPath("/data", host)
p := claimUnitProgram{Schema: 1, Host: host, Args: []string{"-addr", endpoint, "-db", dbPath, "-allow-private"}}
var savedKey string
var savedFetch int64
return p, func(c *http.Client) {
t.Helper()
resp, err := c.Get("http://tenant/unfurl?url=" + url.QueryEscape(upstream))
if err != nil {
t.Fatal(err)
}
var card map[string]any
err = json.NewDecoder(resp.Body).Decode(&card)
resp.Body.Close()
if err != nil || resp.StatusCode != http.StatusOK || card["ok"] != false || contacted.Load() != 0 {
t.Fatal("Woodstar containment allowed sibling fetch", resp.Status, card, contacted.Load(), err)
}
db, err := sql.Open("sqlite", dbPath)
if err != nil {
t.Fatal(err)
}
defer db.Close()
var key string
if err := db.QueryRow("SELECT value FROM config WHERE key = 'img_sign_key'").Scan(&key); err != nil || len(key) != 64 {
t.Fatal("Woodstar did not persist its signing key", err)
}
var fetched int64
if err := db.QueryRow("SELECT fetched_at FROM cards WHERE url = ? AND ok = 0", upstream).Scan(&fetched); err != nil || fetched <= 0 {
t.Fatal("Woodstar did not persist its cache", err, fetched)
}
if savedKey != "" && (savedKey != key || savedFetch != fetched) {
t.Fatal("Woodstar restart lost persistent state")
}
savedKey, savedFetch = key, fetched
control := &http.Client{Timeout: time.Second}
resp, err = control.Get(upstream)
if err != nil {
t.Fatal(err)
}
resp.Body.Close()
if contacted.Swap(0) != 1 {
t.Fatal("upstream control did not connect")
}
}
}