66 lines
2.2 KiB
Go
66 lines
2.2 KiB
Go
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)
|
|
}
|
|
}
|