package activator import ( "errors" "testing" "github.com/carlosframework/platform/internal/hostbox" "github.com/carlosframework/platform/internal/registry" ) func TestRev2ShapeIsolatedArgv(t *testing.T) { const launch, run = "/data/instances/i1", "/run/carlos/instances/i1" sock, db := run+"/app.sock", launch+"/app.db" args := func(extra ...string) []string { return append([]string{"--socket", sock, "--db", db}, extra...) } env := []string{"CARLOS_ADMIN_TOKEN=t", "A=1"} argv, s, d, err := IsolatedArgv("h.example", launch, run, args(), env) if err != nil || s != sock || d != db || len(argv) != 5 || argv[0] != "/opt/carlos/live/h.example" && argv[0] == "" { t.Fatalf("valid: %v %q %q %v", err, s, d, argv) } for name, tc := range map[string]struct{ args, env []string }{ "odd": {args("--x"), env}, "extra": {args("--x", "y"), env}, "dup socket": {args("--socket", sock), env}, "dup db": {args("--db", db), env}, "NUL": {[]string{"--socket", sock + "\x00", "--db", db}, env}, "wrong dir": {[]string{"--socket", "/tmp/app.sock", "--db", db}, env}, "unclean": {[]string{"--socket", run + "/../i1/app.sock", "--db", db}, env}, "no env": {args(), nil}, "no token": {args(), []string{"A=1"}}, "empty token": {args(), []string{"CARLOS_ADMIN_TOKEN="}}, "dup env": {args(), append([]string{"A=2"}, env...)}, "bad env": {args(), append([]string{"X"}, env...)}, "NUL env": {args(), append([]string{"X=\x00"}, env...)}, } { if _, _, _, err := IsolatedArgv("h.example", launch, run, tc.args, tc.env); !errors.Is(err, hostbox.ErrRoleLaunchShape) { t.Fatalf("%s: %v", name, err) } } } func TestRev2ShapeClaimLaunchRoles(t *testing.T) { b := &ExecBackend{DataDir: t.TempDir()} if got, err := b.ClaimLaunchRoles(registry.Route{Host: "h.example"}); err != nil || len(got) != 1 || got[0] != "main" { t.Fatalf("roles=%v err=%v", got, err) } if got, err := b.ClaimLaunchRoles(registry.Route{Host: "h.example", Seed: `["init"]`}); err != nil || len(got) != 2 || got[1] != "seed" { t.Fatalf("roles=%v err=%v", got, err) } }