1//go:build linux
2
3package wlturbo
4
5import (
6 "os"
7 "os/exec"
8 "path/filepath"
9 "testing"
10)
11
12// Run the public socketpair integration against a separate module, with no
13// imports from internal/ and no worktree replacement outside its temp go.mod.
14func TestExternalConsumer(t *testing.T) {
15 goBin, err := exec.LookPath("go")
16 if err != nil {
17 t.Skip("go executable unavailable: external module integration requires go")
18 }
19 root, err := os.Getwd()
20 if err != nil {
21 t.Fatal(err)
22 }
23 temp := t.TempDir()
24 mod := "module example.com/wlturbo-consumer\n\ngo 1.27\n\nrequire github.com/bnema/wlturbo v0.0.0\nreplace github.com/bnema/wlturbo => " + root + "\n"
25 if err := os.WriteFile(filepath.Join(temp, "go.mod"), []byte(mod), 0600); err != nil {
26 t.Fatal(err)
27 }
28 source, err := os.ReadFile(filepath.Join(root, "protocol/core/core_test.go"))
29 if err != nil {
30 t.Fatal(err)
31 }
32 // The external module has no access to the package's test helpers except
33 // the ones copied into this temporary module. Compile and exercise only
34 // the public integration scenarios, including typed key, frame and release.
35 if err := os.WriteFile(filepath.Join(temp, "consumer_test.go"), source, 0600); err != nil {
36 t.Fatal(err)
37 }
38 // Keep the extension fake server in a separate package: both fixtures
39 // independently own their socketpair helpers.
40 extension, err := os.ReadFile(filepath.Join(root, "protocol/extensions_test.go"))
41 if err != nil {
42 t.Fatal(err)
43 }
44 if err := os.Mkdir(filepath.Join(temp, "extensions"), 0700); err != nil {
45 t.Fatal(err)
46 }
47 if err := os.WriteFile(filepath.Join(temp, "extensions", "extensions_test.go"), extension, 0600); err != nil {
48 t.Fatal(err)
49 }
50 negotiation, err := os.ReadFile(filepath.Join(root, "protocol/negotiation_test.go"))
51 if err != nil {
52 t.Fatal(err)
53 }
54 if err := os.WriteFile(filepath.Join(temp, "extensions", "negotiation_test.go"), negotiation, 0600); err != nil {
55 t.Fatal(err)
56 }
57 cmd := exec.Command(goBin, "test", "-run", "TestGeneratedCoreOverSocketpair|TestBufferReleaseAndOfferChild|TestExtensionsOverSocketpair|TestAnnouncedVersionNegotiation", "./...")
58 cmd.Dir = temp
59 cmd.Env = append(os.Environ(), "GOWORK=off", "GOFLAGS=-mod=mod")
60 if output, err := cmd.CombinedOutput(); err != nil {
61 t.Fatalf("external consumer: %v\n%s", err, output)
62 }
63}