| package dbus |
| |
| import "testing" |
| |
| func TestSessionBus(t *testing.T) { |
| _, err := SessionBus() |
| if err != nil { |
| t.Error(err) |
| } |
| } |
| |
| func TestSystemBus(t *testing.T) { |
| _, err := SystemBus() |
| if err != nil { |
| t.Error(err) |
| } |
| } |
| |
| func TestSend(t *testing.T) { |
| bus, err := SessionBus() |
| if err != nil { |
| t.Error(err) |
| } |
| ch := make(chan *Call, 1) |
| msg := &Message{ |
| Type: TypeMethodCall, |
| Flags: 0, |
| Headers: map[HeaderField]Variant{ |
| FieldDestination: MakeVariant(bus.Names()[0]), |
| FieldPath: MakeVariant(ObjectPath("/org/freedesktop/DBus")), |
| FieldInterface: MakeVariant("org.freedesktop.DBus.Peer"), |
| FieldMember: MakeVariant("Ping"), |
| }, |
| } |
| call := bus.Send(msg, ch) |
| <-ch |
| if call.Err != nil { |
| t.Error(call.Err) |
| } |
| } |
| |
| type server struct{} |
| |
| func (server) Double(i int64) (int64, *Error) { |
| return 2 * i, nil |
| } |
| |
| func BenchmarkCall(b *testing.B) { |
| b.StopTimer() |
| var s string |
| bus, err := SessionBus() |
| if err != nil { |
| b.Fatal(err) |
| } |
| name := bus.Names()[0] |
| obj := bus.BusObject() |
| b.StartTimer() |
| for i := 0; i < b.N; i++ { |
| err := obj.Call("org.freedesktop.DBus.GetNameOwner", 0, name).Store(&s) |
| if err != nil { |
| b.Fatal(err) |
| } |
| if s != name { |
| b.Errorf("got %s, wanted %s", s, name) |
| } |
| } |
| } |
| |
| func BenchmarkCallAsync(b *testing.B) { |
| b.StopTimer() |
| bus, err := SessionBus() |
| if err != nil { |
| b.Fatal(err) |
| } |
| name := bus.Names()[0] |
| obj := bus.BusObject() |
| c := make(chan *Call, 50) |
| done := make(chan struct{}) |
| go func() { |
| for i := 0; i < b.N; i++ { |
| v := <-c |
| if v.Err != nil { |
| b.Error(v.Err) |
| } |
| s := v.Body[0].(string) |
| if s != name { |
| b.Errorf("got %s, wanted %s", s, name) |
| } |
| } |
| close(done) |
| }() |
| b.StartTimer() |
| for i := 0; i < b.N; i++ { |
| obj.Go("org.freedesktop.DBus.GetNameOwner", 0, c, name) |
| } |
| <-done |
| } |
| |
| func BenchmarkServe(b *testing.B) { |
| b.StopTimer() |
| srv, err := SessionBus() |
| if err != nil { |
| b.Fatal(err) |
| } |
| cli, err := SessionBusPrivate() |
| if err != nil { |
| b.Fatal(err) |
| } |
| if err = cli.Auth(nil); err != nil { |
| b.Fatal(err) |
| } |
| if err = cli.Hello(); err != nil { |
| b.Fatal(err) |
| } |
| benchmarkServe(b, srv, cli) |
| } |
| |
| func BenchmarkServeAsync(b *testing.B) { |
| b.StopTimer() |
| srv, err := SessionBus() |
| if err != nil { |
| b.Fatal(err) |
| } |
| cli, err := SessionBusPrivate() |
| if err != nil { |
| b.Fatal(err) |
| } |
| if err = cli.Auth(nil); err != nil { |
| b.Fatal(err) |
| } |
| if err = cli.Hello(); err != nil { |
| b.Fatal(err) |
| } |
| benchmarkServeAsync(b, srv, cli) |
| } |
| |
| func BenchmarkServeSameConn(b *testing.B) { |
| b.StopTimer() |
| bus, err := SessionBus() |
| if err != nil { |
| b.Fatal(err) |
| } |
| |
| benchmarkServe(b, bus, bus) |
| } |
| |
| func BenchmarkServeSameConnAsync(b *testing.B) { |
| b.StopTimer() |
| bus, err := SessionBus() |
| if err != nil { |
| b.Fatal(err) |
| } |
| |
| benchmarkServeAsync(b, bus, bus) |
| } |
| |
| func benchmarkServe(b *testing.B, srv, cli *Conn) { |
| var r int64 |
| var err error |
| dest := srv.Names()[0] |
| srv.Export(server{}, "/org/guelfey/DBus/Test", "org.guelfey.DBus.Test") |
| obj := cli.Object(dest, "/org/guelfey/DBus/Test") |
| b.StartTimer() |
| for i := 0; i < b.N; i++ { |
| err = obj.Call("org.guelfey.DBus.Test.Double", 0, int64(i)).Store(&r) |
| if err != nil { |
| b.Fatal(err) |
| } |
| if r != 2*int64(i) { |
| b.Errorf("got %d, wanted %d", r, 2*int64(i)) |
| } |
| } |
| } |
| |
| func benchmarkServeAsync(b *testing.B, srv, cli *Conn) { |
| dest := srv.Names()[0] |
| srv.Export(server{}, "/org/guelfey/DBus/Test", "org.guelfey.DBus.Test") |
| obj := cli.Object(dest, "/org/guelfey/DBus/Test") |
| c := make(chan *Call, 50) |
| done := make(chan struct{}) |
| go func() { |
| for i := 0; i < b.N; i++ { |
| v := <-c |
| if v.Err != nil { |
| b.Fatal(v.Err) |
| } |
| i, r := v.Args[0].(int64), v.Body[0].(int64) |
| if 2*i != r { |
| b.Errorf("got %d, wanted %d", r, 2*i) |
| } |
| } |
| close(done) |
| }() |
| b.StartTimer() |
| for i := 0; i < b.N; i++ { |
| obj.Go("org.guelfey.DBus.Test.Double", 0, c, int64(i)) |
| } |
| <-done |
| } |