1
0
mirror of https://github.com/AvengeMedia/DankMaterialShell.git synced 2025-12-10 07:25:37 -05:00
Files
DankMaterialShell/backend/internal/server/loginctl/monitor_test.go
2025-11-12 17:18:45 -05:00

323 lines
7.6 KiB
Go

package loginctl
import (
"sync"
"testing"
"github.com/godbus/dbus/v5"
"github.com/stretchr/testify/assert"
)
func TestManager_HandleDBusSignal_Lock(t *testing.T) {
manager := &Manager{
state: &SessionState{
Locked: false,
LockedHint: false,
},
stateMutex: sync.RWMutex{},
subscribers: make(map[string]chan SessionState),
subMutex: sync.RWMutex{},
dirty: make(chan struct{}, 1),
}
sig := &dbus.Signal{
Name: "org.freedesktop.login1.Session.Lock",
}
manager.handleDBusSignal(sig)
manager.stateMutex.RLock()
defer manager.stateMutex.RUnlock()
assert.True(t, manager.state.Locked)
assert.True(t, manager.state.LockedHint)
}
func TestManager_HandleDBusSignal_Unlock(t *testing.T) {
manager := &Manager{
state: &SessionState{
Locked: true,
LockedHint: true,
},
stateMutex: sync.RWMutex{},
subscribers: make(map[string]chan SessionState),
subMutex: sync.RWMutex{},
dirty: make(chan struct{}, 1),
}
sig := &dbus.Signal{
Name: "org.freedesktop.login1.Session.Unlock",
}
manager.handleDBusSignal(sig)
manager.stateMutex.RLock()
defer manager.stateMutex.RUnlock()
assert.False(t, manager.state.Locked)
assert.False(t, manager.state.LockedHint)
}
func TestManager_HandleDBusSignal_PrepareForSleep(t *testing.T) {
t.Run("preparing for sleep - true", func(t *testing.T) {
manager := &Manager{
state: &SessionState{
PreparingForSleep: false,
},
stateMutex: sync.RWMutex{},
subscribers: make(map[string]chan SessionState),
subMutex: sync.RWMutex{},
dirty: make(chan struct{}, 1),
}
sig := &dbus.Signal{
Name: "org.freedesktop.login1.Manager.PrepareForSleep",
Body: []interface{}{true},
}
manager.handleDBusSignal(sig)
manager.stateMutex.RLock()
defer manager.stateMutex.RUnlock()
assert.True(t, manager.state.PreparingForSleep)
})
t.Run("preparing for sleep - false", func(t *testing.T) {
manager := &Manager{
state: &SessionState{
PreparingForSleep: true,
},
stateMutex: sync.RWMutex{},
subscribers: make(map[string]chan SessionState),
subMutex: sync.RWMutex{},
dirty: make(chan struct{}, 1),
}
sig := &dbus.Signal{
Name: "org.freedesktop.login1.Manager.PrepareForSleep",
Body: []interface{}{false},
}
manager.handleDBusSignal(sig)
manager.stateMutex.RLock()
defer manager.stateMutex.RUnlock()
assert.False(t, manager.state.PreparingForSleep)
})
t.Run("empty body", func(t *testing.T) {
manager := &Manager{
state: &SessionState{
PreparingForSleep: false,
},
stateMutex: sync.RWMutex{},
subscribers: make(map[string]chan SessionState),
subMutex: sync.RWMutex{},
dirty: make(chan struct{}, 1),
}
sig := &dbus.Signal{
Name: "org.freedesktop.login1.Manager.PrepareForSleep",
Body: []interface{}{},
}
manager.handleDBusSignal(sig)
manager.stateMutex.RLock()
defer manager.stateMutex.RUnlock()
assert.False(t, manager.state.PreparingForSleep)
})
}
func TestManager_HandlePropertiesChanged(t *testing.T) {
t.Run("active property changed", func(t *testing.T) {
manager := &Manager{
state: &SessionState{
Active: false,
},
stateMutex: sync.RWMutex{},
subscribers: make(map[string]chan SessionState),
subMutex: sync.RWMutex{},
dirty: make(chan struct{}, 1),
}
sig := &dbus.Signal{
Name: "org.freedesktop.DBus.Properties.PropertiesChanged",
Body: []interface{}{
"org.freedesktop.login1.Session",
map[string]dbus.Variant{
"Active": dbus.MakeVariant(true),
},
},
}
manager.handlePropertiesChanged(sig)
manager.stateMutex.RLock()
defer manager.stateMutex.RUnlock()
assert.True(t, manager.state.Active)
})
t.Run("idle hint property changed", func(t *testing.T) {
manager := &Manager{
state: &SessionState{
IdleHint: false,
},
stateMutex: sync.RWMutex{},
subscribers: make(map[string]chan SessionState),
subMutex: sync.RWMutex{},
dirty: make(chan struct{}, 1),
}
sig := &dbus.Signal{
Name: "org.freedesktop.DBus.Properties.PropertiesChanged",
Body: []interface{}{
"org.freedesktop.login1.Session",
map[string]dbus.Variant{
"IdleHint": dbus.MakeVariant(true),
},
},
}
manager.handlePropertiesChanged(sig)
manager.stateMutex.RLock()
defer manager.stateMutex.RUnlock()
assert.True(t, manager.state.IdleHint)
})
t.Run("idle since hint property changed", func(t *testing.T) {
manager := &Manager{
state: &SessionState{
IdleSinceHint: 0,
},
stateMutex: sync.RWMutex{},
subscribers: make(map[string]chan SessionState),
subMutex: sync.RWMutex{},
dirty: make(chan struct{}, 1),
}
sig := &dbus.Signal{
Name: "org.freedesktop.DBus.Properties.PropertiesChanged",
Body: []interface{}{
"org.freedesktop.login1.Session",
map[string]dbus.Variant{
"IdleSinceHint": dbus.MakeVariant(uint64(123456789)),
},
},
}
manager.handlePropertiesChanged(sig)
manager.stateMutex.RLock()
defer manager.stateMutex.RUnlock()
assert.Equal(t, uint64(123456789), manager.state.IdleSinceHint)
})
t.Run("locked hint property changed", func(t *testing.T) {
manager := &Manager{
state: &SessionState{
LockedHint: false,
Locked: false,
},
stateMutex: sync.RWMutex{},
subscribers: make(map[string]chan SessionState),
subMutex: sync.RWMutex{},
dirty: make(chan struct{}, 1),
}
sig := &dbus.Signal{
Name: "org.freedesktop.DBus.Properties.PropertiesChanged",
Body: []interface{}{
"org.freedesktop.login1.Session",
map[string]dbus.Variant{
"LockedHint": dbus.MakeVariant(true),
},
},
}
manager.handlePropertiesChanged(sig)
manager.stateMutex.RLock()
defer manager.stateMutex.RUnlock()
assert.True(t, manager.state.LockedHint)
assert.True(t, manager.state.Locked)
})
t.Run("wrong interface", func(t *testing.T) {
manager := &Manager{
state: &SessionState{
Active: false,
},
stateMutex: sync.RWMutex{},
subscribers: make(map[string]chan SessionState),
subMutex: sync.RWMutex{},
dirty: make(chan struct{}, 1),
}
sig := &dbus.Signal{
Name: "org.freedesktop.DBus.Properties.PropertiesChanged",
Body: []interface{}{
"org.freedesktop.SomeOtherInterface",
map[string]dbus.Variant{
"Active": dbus.MakeVariant(true),
},
},
}
manager.handlePropertiesChanged(sig)
manager.stateMutex.RLock()
defer manager.stateMutex.RUnlock()
assert.False(t, manager.state.Active)
})
t.Run("empty body", func(t *testing.T) {
manager := &Manager{
state: &SessionState{},
stateMutex: sync.RWMutex{},
subscribers: make(map[string]chan SessionState),
subMutex: sync.RWMutex{},
dirty: make(chan struct{}, 1),
}
sig := &dbus.Signal{
Name: "org.freedesktop.DBus.Properties.PropertiesChanged",
Body: []interface{}{},
}
assert.NotPanics(t, func() {
manager.handlePropertiesChanged(sig)
})
})
t.Run("multiple properties changed", func(t *testing.T) {
manager := &Manager{
state: &SessionState{
Active: false,
IdleHint: false,
},
stateMutex: sync.RWMutex{},
subscribers: make(map[string]chan SessionState),
subMutex: sync.RWMutex{},
dirty: make(chan struct{}, 1),
}
sig := &dbus.Signal{
Name: "org.freedesktop.DBus.Properties.PropertiesChanged",
Body: []interface{}{
"org.freedesktop.login1.Session",
map[string]dbus.Variant{
"Active": dbus.MakeVariant(true),
"IdleHint": dbus.MakeVariant(true),
},
},
}
manager.handlePropertiesChanged(sig)
manager.stateMutex.RLock()
defer manager.stateMutex.RUnlock()
assert.True(t, manager.state.Active)
assert.True(t, manager.state.IdleHint)
})
}