//go:build linux || darwin // +build linux darwin package main import ( "bytes" "log" "os" "os/exec" "plugin" "testing" ) // This is a cursory test that checks whether things work under dynamic linking. func TestMain(m *testing.M) { cmd := exec.Command( "go", "build", "-buildmode", "plugin", "-o", "plugin.so", "plugin.go", ) var out bytes.Buffer cmd.Stdout = &out cmd.Stderr = &out if err := cmd.Run(); err != nil { log.Fatalf("Error building plugin: %s\nOutput:\n%s", err, out.String()) } os.Exit(m.Run()) } func TestDynamic(t *testing.T) { plug, err := plugin.Open("plugin.so") if err != nil { t.Fatal(err) } for _, test := range []string{ "TestSum", "TestDigest", } { f, err := plug.Lookup(test) if err != nil { t.Fatalf("cannot find func %s: %s", test, err) } f.(func(*testing.T))(t) } }