package wine import ( "os" "os/exec" "path/filepath" "strings" "testing" ) func TestInstalledVersion(t *testing.T) { root := t.TempDir() helper := filepath.Join(root, "wine-access.exe") // The launcher must never run, including for old helpers lacking metadata. marker := filepath.Join(root, "executed") if err := os.WriteFile(helper, []byte("#!/bin/sh\ntouch '"+marker+"'\nexit 99\n"), 0700); err != nil { t.Fatal(err) } t.Setenv("CTHULHU_WINE_ACCESS_HELPER", helper) for _, test := range []struct { name, declaration, want string }{ {"current", `const char release[] = "2026.10.24";`, "2026.10.24"}, {"old helper", `int unused;`, ""}, {"invalid date", `const char release[] = "2026.99.99";`, ""}, {"oversized", `const char release[] = "2026.10.24 extra";`, ""}, {"unterminated", `const char release[11] = "2026.10.24x";`, ""}, } { t.Run(test.name, func(t *testing.T) { source := "__attribute__((used, section(\".wine_access.version\")))\n" + test.declaration if test.name == "old helper" { source = test.declaration } command := exec.Command("cc", "-shared", "-fPIC", "-x", "c", "-o", helper+".so", "-") command.Stdin = strings.NewReader(source) if output, err := command.CombinedOutput(); err != nil { t.Fatalf("compile helper metadata fixture: %v\n%s", err, output) } if got := InstalledVersion(); got != test.want { t.Fatalf("InstalledVersion() = %q, want %q", got, test.want) } link := filepath.Join(t.TempDir(), "wine-access.exe") if err := os.Symlink(helper, link); err != nil { t.Fatal(err) } t.Setenv("CTHULHU_WINE_ACCESS_HELPER", link) if got := InstalledVersion(); got != test.want { t.Fatalf("symlink InstalledVersion() = %q, want %q", got, test.want) } }) } if _, err := os.Stat(marker); !os.IsNotExist(err) { t.Fatalf("version detection executed the helper: %v", err) } if err := os.WriteFile(helper+".so", []byte("broken sidecar"), 0600); err != nil { t.Fatal(err) } if got := InstalledVersion(); got != "" { t.Fatalf("invalid ELF returned %q", got) } t.Setenv("CTHULHU_WINE_ACCESS_HELPER", "/usr/bin/true") if got := InstalledVersion(); got != "" { t.Fatalf("missing sidecar returned %q", got) } }