90 lines
2.0 KiB
Go
90 lines
2.0 KiB
Go
//go:build mxl_integration
|
|
|
|
package mxlfabrics_test
|
|
|
|
import (
|
|
"os"
|
|
"testing"
|
|
|
|
"github.com/qvest-digital/go-mxl/fabrics"
|
|
"github.com/qvest-digital/go-mxl/mxl"
|
|
)
|
|
|
|
func requireSHMInterface(
|
|
t *testing.T,
|
|
instance *fabrics.Instance,
|
|
) fabrics.InterfaceConfig {
|
|
t.Helper()
|
|
|
|
interfaces, err := instance.Interfaces(&fabrics.InterfaceConfig{
|
|
Provider: fabrics.ProviderSHM,
|
|
})
|
|
if err != nil {
|
|
t.Fatalf("enumerate SHM interfaces: %v", err)
|
|
}
|
|
|
|
for _, iface := range interfaces {
|
|
if iface.Provider != fabrics.ProviderSHM {
|
|
continue
|
|
}
|
|
if iface.Caps.Flags&fabrics.InterfaceCapRemoteWrite == 0 {
|
|
continue
|
|
}
|
|
|
|
// Allow libfabric to assign a unique local SHM endpoint during
|
|
// Target.Setup or Initiator.Setup. The enumerated service is
|
|
// descriptive and should not be reused by both endpoints.
|
|
iface.Address.Service = ""
|
|
return iface
|
|
}
|
|
|
|
t.Fatal("no remote-write-capable SHM Fabrics interface found")
|
|
return fabrics.InterfaceConfig{}
|
|
}
|
|
|
|
func TestInterfacesIncludesSHM(t *testing.T) {
|
|
if _, err := os.Stat("/dev/shm"); err != nil {
|
|
t.Skipf("/dev/shm is unavailable: %v", err)
|
|
}
|
|
|
|
domain, err := os.MkdirTemp("/dev/shm", "mxl-player-fabrics-*")
|
|
if err != nil {
|
|
t.Fatalf("create temporary MXL domain: %v", err)
|
|
}
|
|
t.Cleanup(func() {
|
|
if err := os.RemoveAll(domain); err != nil {
|
|
t.Errorf("remove temporary MXL domain: %v", err)
|
|
}
|
|
})
|
|
|
|
instance, err := mxl.NewInstance(domain, "")
|
|
if err != nil {
|
|
t.Fatalf("create MXL instance: %v", err)
|
|
}
|
|
t.Cleanup(func() {
|
|
if err := instance.Close(); err != nil {
|
|
t.Errorf("close MXL instance: %v", err)
|
|
}
|
|
})
|
|
|
|
fabricInstance, err := fabrics.NewInstance(instance)
|
|
if err != nil {
|
|
t.Fatalf("create Fabrics instance: %v", err)
|
|
}
|
|
t.Cleanup(func() {
|
|
if err := fabricInstance.Close(); err != nil {
|
|
t.Errorf("close Fabrics instance: %v", err)
|
|
}
|
|
})
|
|
|
|
iface := requireSHMInterface(t, fabricInstance)
|
|
|
|
t.Logf(
|
|
"SHM interface: node=%q flags=%#x max-message-size=%d attr=%q",
|
|
iface.Address.Node,
|
|
iface.Caps.Flags,
|
|
iface.Caps.MaxMessageSize,
|
|
iface.Attr,
|
|
)
|
|
}
|