1
0
forked from rosa/hakurei
Files
hakurei/internal/uevent/message_test.go
Ophestra 121fcfa406 internal/uevent: enumerate objects via sysfs
This is not a great way to implement cold boot, but I already have the implementation lying around.

Signed-off-by: Ophestra <cat@gensokyo.uk>
2026-03-29 19:50:20 +09:00

133 lines
3.6 KiB
Go

package uevent_test
import (
"syscall"
"testing"
"hakurei.app/internal/uevent"
)
func TestMessage(t *testing.T) {
t.Parallel()
testCases := []struct {
name string
v uevent.Message
want string
wantErr error
wantErrE error
s string
}{
{"sample virtio-sound-pci add", uevent.Message{
Action: uevent.KOBJ_ADD,
DevPath: "/devices/pci0000:00/0000:00:04.0/virtio1",
Env: []string{
"ACTION=add",
"DEVPATH=/devices/pci0000:00/0000:00:04.0/virtio1",
"SUBSYSTEM=virtio",
"MODALIAS=virtio:d00000019v00001AF4",
"SEQNUM=779",
},
}, "add@/devices/pci0000:00/0000:00:04.0/virtio1\x00" +
"ACTION=add\x00" +
"DEVPATH=/devices/pci0000:00/0000:00:04.0/virtio1\x00" +
"SUBSYSTEM=virtio\x00" +
"MODALIAS=virtio:d00000019v00001AF4\x00" +
"SEQNUM=779\x00",
nil, nil, `add event on /devices/pci0000:00/0000:00:04.0/virtio1:
ACTION=add
DEVPATH=/devices/pci0000:00/0000:00:04.0/virtio1
SUBSYSTEM=virtio
MODALIAS=virtio:d00000019v00001AF4
SEQNUM=779`},
{"sample virtio-sound-pci bind", uevent.Message{
Action: uevent.KOBJ_BIND,
DevPath: "/devices/pci0000:00/0000:00:04.0",
Env: []string{
"ACTION=bind",
"DEVPATH=/devices/pci0000:00/0000:00:04.0",
"SUBSYSTEM=pci",
"DRIVER=virtio-pci",
"PCI_CLASS=40100",
"PCI_ID=1AF4:1059",
"PCI_SUBSYS_ID=1AF4:1100",
"PCI_SLOT_NAME=0000:00:04.0",
"MODALIAS=pci:v00001AF4d00001059sv00001AF4sd00001100bc04sc01i00",
"SEQNUM=780",
},
}, "bind@/devices/pci0000:00/0000:00:04.0\x00" +
"ACTION=bind\x00" +
"DEVPATH=/devices/pci0000:00/0000:00:04.0\x00" +
"SUBSYSTEM=pci\x00" +
"DRIVER=virtio-pci\x00" +
"PCI_CLASS=40100\x00" +
"PCI_ID=1AF4:1059\x00" +
"PCI_SUBSYS_ID=1AF4:1100\x00" +
"PCI_SLOT_NAME=0000:00:04.0\x00" +
"MODALIAS=pci:v00001AF4d00001059sv00001AF4sd00001100bc04sc01i00\x00" +
"SEQNUM=780\x00", nil, nil, `bind event on /devices/pci0000:00/0000:00:04.0:
ACTION=bind
DEVPATH=/devices/pci0000:00/0000:00:04.0
SUBSYSTEM=pci
DRIVER=virtio-pci
PCI_CLASS=40100
PCI_ID=1AF4:1059
PCI_SUBSYS_ID=1AF4:1100
PCI_SLOT_NAME=0000:00:04.0
MODALIAS=pci:v00001AF4d00001059sv00001AF4sd00001100bc04sc01i00
SEQNUM=780`},
{"zero devpath env", uevent.Message{
Action: uevent.KOBJ_MOVE,
}, "move@\x00", nil, nil, "move event:"},
{"d final NUL e bad action", uevent.Message{
Action: 0xbad,
}, "move@\x00truncated", &uevent.MessageError{
Data: "move@\x00truncated",
Section: "truncated",
Kind: uevent.MErrorKindFinalNUL,
}, syscall.EINVAL, "unsupported kobject_action 2989 event:"},
{"bad action", uevent.Message{
Action: 0xbad,
}, "nonexistent@\x00", uevent.UnsupportedActionError(
"nonexistent",
), syscall.EINVAL, "unsupported kobject_action 2989 event:"},
{"d header sep e bad action", uevent.Message{
Action: 0xbad,
}, "move\x00", &uevent.MessageError{
Data: "move\x00",
Section: "move",
Kind: uevent.MErrorKindHeaderSep,
}, syscall.EINVAL, "unsupported kobject_action 2989 event:"},
{"d missing header e bad action", uevent.Message{
Action: 0xbad,
}, "move", uevent.MissingHeaderError(
"move",
), syscall.EINVAL, "unsupported kobject_action 2989 event:"},
{"synthetic", uevent.Message{
Action: uevent.Synthetic,
}, "synthetic@\x00", uevent.UnsupportedActionError(
"synthetic",
), nil, "synthetic event:"},
}
for _, tc := range testCases {
t.Run(tc.name, func(t *testing.T) {
t.Parallel()
adeB(t, "", tc.v, tc.want, tc.wantErr, tc.wantErrE)
t.Run("string", func(t *testing.T) {
if got := tc.v.String(); got != tc.s {
t.Errorf("String: %q, want %q", got, tc.s)
}
})
})
}
}