212 lines
4.4 KiB
Go
212 lines
4.4 KiB
Go
package varlink_test
|
|
|
|
// test with no internal access
|
|
|
|
import (
|
|
"github.com/varlink/go/varlink"
|
|
"os"
|
|
"runtime"
|
|
"testing"
|
|
"time"
|
|
)
|
|
|
|
type VarlinkInterface struct{}
|
|
|
|
func (s *VarlinkInterface) VarlinkDispatch(call varlink.Call, methodname string) error {
|
|
return call.ReplyMethodNotImplemented(methodname)
|
|
}
|
|
func (s *VarlinkInterface) VarlinkGetName() string {
|
|
return `org.example.test`
|
|
}
|
|
|
|
func (s *VarlinkInterface) VarlinkGetDescription() string {
|
|
return "#"
|
|
}
|
|
|
|
type VarlinkInterface2 struct{}
|
|
|
|
func (s *VarlinkInterface2) VarlinkDispatch(call varlink.Call, methodname string) error {
|
|
return call.ReplyMethodNotImplemented(methodname)
|
|
}
|
|
func (s *VarlinkInterface2) VarlinkGetName() string {
|
|
return `org.example.test2`
|
|
}
|
|
|
|
func (s *VarlinkInterface2) VarlinkGetDescription() string {
|
|
return "#"
|
|
}
|
|
|
|
func TestRegisterService(t *testing.T) {
|
|
newTestInterface := new(VarlinkInterface)
|
|
service, err := varlink.NewService(
|
|
"Varlink",
|
|
"Varlink Test",
|
|
"1",
|
|
"https://github.com/varlink/go/varlink",
|
|
)
|
|
if err != nil {
|
|
t.Fatalf("NewService(): %v", err)
|
|
}
|
|
|
|
if err := service.RegisterInterface(newTestInterface); err != nil {
|
|
t.Fatalf("Couldn't register service: %v", err)
|
|
}
|
|
|
|
if err := service.RegisterInterface(newTestInterface); err == nil {
|
|
t.Fatal("Could register service twice")
|
|
}
|
|
|
|
defer func() { service.Shutdown() }()
|
|
|
|
servererror := make(chan error)
|
|
|
|
go func() {
|
|
servererror <- service.Listen("unix:varlinkexternal_TestRegisterService", 0)
|
|
}()
|
|
|
|
time.Sleep(time.Second / 5)
|
|
|
|
n := new(VarlinkInterface2)
|
|
|
|
if err := service.RegisterInterface(n); err == nil {
|
|
t.Fatal("Could register service while running")
|
|
}
|
|
time.Sleep(time.Second / 5)
|
|
service.Shutdown()
|
|
|
|
if err := <-servererror; err != nil {
|
|
t.Fatalf("service.Listen(): %v", err)
|
|
}
|
|
}
|
|
|
|
func TestUnix(t *testing.T) {
|
|
newTestInterface := new(VarlinkInterface)
|
|
service, err := varlink.NewService(
|
|
"Varlink",
|
|
"Varlink Test",
|
|
"1",
|
|
"https://github.com/varlink/go/varlink",
|
|
)
|
|
|
|
if err != nil {
|
|
t.Fatalf("NewService(): %v", err)
|
|
}
|
|
|
|
if err := service.RegisterInterface(newTestInterface); err != nil {
|
|
t.Fatalf("RegisterInterface(): %v", err)
|
|
}
|
|
|
|
servererror := make(chan error)
|
|
|
|
go func() {
|
|
servererror <- service.Listen("unix:varlinkexternal_TestUnix", 0)
|
|
}()
|
|
|
|
time.Sleep(time.Second / 5)
|
|
service.Shutdown()
|
|
|
|
if err := <-servererror; err != nil {
|
|
t.Fatalf("service.Listen(): %v", err)
|
|
}
|
|
}
|
|
|
|
func TestInvalidAddress(t *testing.T) {
|
|
newTestInterface := new(VarlinkInterface)
|
|
service, err := varlink.NewService(
|
|
"Varlink",
|
|
"Varlink Test",
|
|
"1",
|
|
"https://github.com/varlink/go/varlink",
|
|
)
|
|
|
|
if err != nil {
|
|
t.Fatalf("NewService(): %v", err)
|
|
}
|
|
|
|
if err = service.RegisterInterface(newTestInterface); err != nil {
|
|
t.Fatalf("RegisterInterface(): %v", err)
|
|
}
|
|
|
|
if err = service.Listen("foo", 0); err == nil {
|
|
t.Fatalf("service.Listen() should error")
|
|
}
|
|
|
|
if err = service.Listen("", 0); err == nil {
|
|
t.Fatalf("service.Listen() should error")
|
|
}
|
|
|
|
if err = service.Listen("unix", 0); err == nil {
|
|
t.Fatalf("service.Listen() should error")
|
|
}
|
|
}
|
|
|
|
func TestAnonUnix(t *testing.T) {
|
|
if runtime.GOOS != "linux" {
|
|
return
|
|
}
|
|
|
|
newTestInterface := new(VarlinkInterface)
|
|
service, err := varlink.NewService(
|
|
"Varlink",
|
|
"Varlink Test",
|
|
"1",
|
|
"https://github.com/varlink/go/varlink",
|
|
)
|
|
|
|
if err != nil {
|
|
t.Fatalf("NewService(): %v", err)
|
|
}
|
|
|
|
if err := service.RegisterInterface(newTestInterface); err != nil {
|
|
t.Fatalf("RegisterInterface(): %v", err)
|
|
}
|
|
|
|
servererror := make(chan error)
|
|
|
|
go func() {
|
|
servererror <- service.Listen("unix:@varlinkexternal_TestAnonUnix", 0)
|
|
}()
|
|
|
|
time.Sleep(time.Second / 5)
|
|
service.Shutdown()
|
|
|
|
if err := <-servererror; err != nil {
|
|
t.Fatalf("service.Listen(): %v", err)
|
|
}
|
|
}
|
|
|
|
func TestListenFDSNotInt(t *testing.T) {
|
|
newTestInterface := new(VarlinkInterface)
|
|
service, err := varlink.NewService(
|
|
"Varlink",
|
|
"Varlink Test",
|
|
"1",
|
|
"https://github.com/varlink/go/varlink",
|
|
)
|
|
|
|
if err != nil {
|
|
t.Fatalf("NewService(): %v", err)
|
|
}
|
|
|
|
if err := service.RegisterInterface(newTestInterface); err != nil {
|
|
t.Fatalf("Couldn't register service: %v", err)
|
|
}
|
|
os.Setenv("LISTEN_FDS", "foo")
|
|
os.Setenv("LISTEN_PID", string(os.Getpid()))
|
|
|
|
servererror := make(chan error)
|
|
|
|
go func() {
|
|
servererror <- service.Listen("unix:varlinkexternal_TestListenFDSNotInt", 0)
|
|
}()
|
|
|
|
time.Sleep(time.Second / 5)
|
|
service.Shutdown()
|
|
|
|
err = <-servererror
|
|
|
|
if err != nil {
|
|
t.Fatalf("service.Run(): %v", err)
|
|
}
|
|
}
|