//go:build darwin || linux package configkit import ( "context" "errors" "os" "os/exec" "path/filepath" "syscall" "testing" "time" ) func TestNonregularSourcesDoNotBlock(t *testing.T) { if mode := os.Getenv("CONFIGKIT_FIFO_TEST_MODE"); mode != "" { root := os.Getenv("CONFIGKIT_FIFO_TEST_ROOT") source := File(filepath.Join(root, "config.yml")) opts := Options[map[string]any]{} switch mode { case "file": source = File(filepath.Join(root, "pipe.yml")) case "import": opts.Imports = true case "profile": opts.Profile = "fifo" } _, err := Load(source, opts) var loadErr *LoadError if !errors.As(err, &loadErr) { t.Fatalf("expected safe load error, got %v", err) } for _, d := range loadErr.Diagnostics() { if d.Code == CodeSourceNotRegular { return } } t.Fatalf("expected nonregular classification, got %v", loadErr.Diagnostics()) } for _, mode := range []string{"file", "import", "profile"} { t.Run(mode, func(t *testing.T) { root := t.TempDir() input := "value: 1\n" if mode == "import" { input = "_configkit:\n imports:\n - path: pipe.yml\n" } if err := os.WriteFile(filepath.Join(root, "config.yml"), []byte(input), 0600); err != nil { t.Fatal(err) } if err := os.Mkdir(filepath.Join(root, "profiles"), 0700); err != nil { t.Fatal(err) } fifo := filepath.Join(root, "pipe.yml") if mode == "profile" { fifo = filepath.Join(root, "profiles", "fifo.yml") } if err := syscall.Mkfifo(fifo, 0600); err != nil { t.Fatal(err) } ctx, cancel := context.WithTimeout(context.Background(), 5*time.Second) defer cancel() cmd := exec.CommandContext(ctx, os.Args[0], "-test.run=^TestNonregularSourcesDoNotBlock$") cmd.Env = append(os.Environ(), "CONFIGKIT_FIFO_TEST_MODE="+mode, "CONFIGKIT_FIFO_TEST_ROOT="+root) out, err := cmd.CombinedOutput() if err != nil { t.Fatalf("FIFO load failed or blocked: %v, %s", err, out) } }) } }