The DBusFakeConnection should have locks to prevent races

Otherwise tests that use dbus signals fail race detection.
pull/6/head
Clayton Coleman 2017-10-11 11:41:30 -04:00
parent bd5eeb1073
commit 3707b10b9f
No known key found for this signature in database
GPG Key ID: 3D16906B4F1C5CB3
1 changed files with 6 additions and 0 deletions

View File

@ -18,6 +18,7 @@ package dbus
import ( import (
"fmt" "fmt"
"sync"
godbus "github.com/godbus/dbus" godbus "github.com/godbus/dbus"
) )
@ -30,6 +31,7 @@ type DBusFake struct {
// DBusFakeConnection represents a fake D-Bus connection // DBusFakeConnection represents a fake D-Bus connection
type DBusFakeConnection struct { type DBusFakeConnection struct {
lock sync.Mutex
busObject *fakeObject busObject *fakeObject
objects map[string]*fakeObject objects map[string]*fakeObject
signalHandlers []chan<- *godbus.Signal signalHandlers []chan<- *godbus.Signal
@ -88,6 +90,8 @@ func (conn *DBusFakeConnection) Object(name, path string) Object {
// Signal is part of the Connection interface // Signal is part of the Connection interface
func (conn *DBusFakeConnection) Signal(ch chan<- *godbus.Signal) { func (conn *DBusFakeConnection) Signal(ch chan<- *godbus.Signal) {
conn.lock.Lock()
defer conn.lock.Unlock()
for i := range conn.signalHandlers { for i := range conn.signalHandlers {
if conn.signalHandlers[i] == ch { if conn.signalHandlers[i] == ch {
conn.signalHandlers = append(conn.signalHandlers[:i], conn.signalHandlers[i+1:]...) conn.signalHandlers = append(conn.signalHandlers[:i], conn.signalHandlers[i+1:]...)
@ -109,6 +113,8 @@ func (conn *DBusFakeConnection) AddObject(name, path string, handler DBusFakeHan
// EmitSignal emits a signal on conn // EmitSignal emits a signal on conn
func (conn *DBusFakeConnection) EmitSignal(name, path, iface, signal string, args ...interface{}) { func (conn *DBusFakeConnection) EmitSignal(name, path, iface, signal string, args ...interface{}) {
conn.lock.Lock()
defer conn.lock.Unlock()
sig := &godbus.Signal{ sig := &godbus.Signal{
Sender: name, Sender: name,
Path: godbus.ObjectPath(path), Path: godbus.ObjectPath(path),