Something went wrong. Try again.
Monorepo for Tangled tangled.org
Something went wrong. Try again.
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146package config
import ( "context" "crypto/rand" "encoding/base64" "testing"
"tangled.org/core/migrator/crypto")
func TestConfigValidation(t *testing.T) { rawKey := make([]byte, 32) rand.Read(rawKey) b64Key := base64.StdEncoding.EncodeToString(rawKey)
cfg := Config{ Hostname: "migrator.tangled.test", PrivateKey: "priv-key-multibase", MasterKey: b64Key, WorkDir: "/tmp/test-migrator", }
if err := cfg.Validate(); err != nil { t.Fatalf("validation failed: %v", err) }
if cfg.ServiceDid.String() != "did:web:migrator.tangled.test" { t.Fatalf("unexpected service DID: %s", cfg.ServiceDid) }
badCfg := cfg badCfg.PrivateKey = b64Key if err := badCfg.Validate(); err == nil { t.Fatal("expected error when MasterKey and PrivateKey are the same") }}
func TestLoadReadsTheDocumentedEnvironment(t *testing.T) { rawKey := make([]byte, 32) rand.Read(rawKey) encoded := base64.StdEncoding.EncodeToString(rawKey)
t.Setenv("MIGRATOR_HOSTNAME", "migrator.tangled.test") t.Setenv("MIGRATOR_PRIVATE_KEY", "zMultibasePrivateKey") t.Setenv("MIGRATOR_MASTER_KEY", encoded) t.Setenv("MIGRATOR_WORK_DIR", "/tmp/test-migrator") t.Setenv("MIGRATOR_APP_URL", "https://web.tangled.test")
cfg, err := Load(context.Background()) if err != nil { t.Fatalf("loading config from the environment failed: %v", err) }
if got := cfg.ServiceDid.String(); got != "did:web:migrator.tangled.test" { t.Fatalf("service DID = %q, want did:web:migrator.tangled.test", got) } var want crypto.MasterKey copy(want[:], rawKey) if cfg.ParsedMasterKey != want { t.Fatal("parsed master key does not match MIGRATOR_MASTER_KEY") } if cfg.MaxDiskBytes != 20*1024*1024*1024 { t.Fatalf("MaxDiskBytes = %d, want 20 GiB scratch budget", cfg.MaxDiskBytes) } if cfg.MaxPackBytes != 256*1024*1024 { t.Fatalf("MaxPackBytes = %d, want knot import cap", cfg.MaxPackBytes) } if cfg.MaxActivePerOwner != 2 { t.Fatalf("MaxActivePerOwner = %d, want 2", cfg.MaxActivePerOwner) } if cfg.AppURL != "https://web.tangled.test" { t.Fatalf("AppURL = %q, want MIGRATOR_APP_URL verbatim", cfg.AppURL) }}
func TestServiceURLFollowsTheDIDWebMethod(t *testing.T) { cases := []struct { hostname string want string }{ {"migrator.tangled.test", "https://migrator.tangled.test"}, {"did:web:migrator.tangled.test", "https://migrator.tangled.test"}, {"did:web:example.test:migrator", "https://example.test/migrator"}, } for _, tc := range cases { cfg := Config{ Hostname: tc.hostname, PrivateKey: "zMultibasePrivateKey", MasterKey: base64.StdEncoding.EncodeToString(make([]byte, 32)), } if err := cfg.Validate(); err != nil { t.Fatalf("%s: %v", tc.hostname, err) } if got := cfg.ServiceURL(); got != tc.want { t.Fatalf("ServiceURL for %s = %q, want %q", tc.hostname, got, tc.want) } }}
func TestAppURLIsABareOriginOrFallsBack(t *testing.T) { cases := []struct { name string appURL string want string }{ {"unset falls back to the service origin", "", "https://migrator.tangled.test"}, {"configured origin", "https://web.tangled.test", "https://web.tangled.test"}, {"trailing slash trimmed", "https://web.tangled.test/", "https://web.tangled.test"}, } for _, tc := range cases { t.Run(tc.name, func(t *testing.T) { cfg := Config{ Hostname: "migrator.tangled.test", PrivateKey: "zMultibasePrivateKey", MasterKey: base64.StdEncoding.EncodeToString(make([]byte, 32)), AppURL: tc.appURL, } if err := cfg.Validate(); err != nil { t.Fatalf("validation failed: %v", err) } if cfg.AppURL != tc.want { t.Fatalf("AppURL = %q, want %q", cfg.AppURL, tc.want) } }) }
for _, bad := range []string{ "https://web.tangled.test/path", "https://web.tangled.test/?next=x", "ftp://web.tangled.test", "app.example.test", "//evil.test", } { cfg := Config{ Hostname: "migrator.tangled.test", PrivateKey: "zMultibasePrivateKey", MasterKey: base64.StdEncoding.EncodeToString(make([]byte, 32)), AppURL: bad, } if err := cfg.Validate(); err == nil { t.Errorf("AppURL %q accepted; want rejected", bad) } }}