internal/kobject: range over objects
All checks were successful
Test / Create distribution (push) Successful in 2m40s
Test / Sandbox (push) Successful in 2m46s
Test / ShareFS (push) Successful in 3m43s
Test / Hakurei (push) Successful in 4m2s
Test / Sandbox (race detector) (push) Successful in 5m20s
Test / Hakurei (race detector) (push) Successful in 6m34s
Test / Flake checks (push) Successful in 1m20s
All checks were successful
Test / Create distribution (push) Successful in 2m40s
Test / Sandbox (push) Successful in 2m46s
Test / ShareFS (push) Successful in 3m43s
Test / Hakurei (push) Successful in 4m2s
Test / Sandbox (race detector) (push) Successful in 5m20s
Test / Hakurei (race detector) (push) Successful in 6m34s
Test / Flake checks (push) Successful in 1m20s
For matching devices based on some criteria. Signed-off-by: Ophestra <cat@gensokyo.uk>
This commit is contained in:
@@ -2,6 +2,7 @@ package kobject_test
|
||||
|
||||
import (
|
||||
"bytes"
|
||||
"context"
|
||||
_ "embed"
|
||||
"encoding/json"
|
||||
"fmt"
|
||||
@@ -10,7 +11,9 @@ import (
|
||||
"reflect"
|
||||
"slices"
|
||||
"strings"
|
||||
"sync"
|
||||
"testing"
|
||||
"testing/synctest"
|
||||
"unsafe"
|
||||
|
||||
. "hakurei.app/internal/kobject"
|
||||
@@ -335,6 +338,90 @@ func TestConsume(t *testing.T) {
|
||||
}
|
||||
}
|
||||
|
||||
func TestIter(t *testing.T) {
|
||||
t.Parallel()
|
||||
synctest.Test(t, func(t *testing.T) {
|
||||
s := New(uevent.UUID{}, nil, nil)
|
||||
var wg sync.WaitGroup
|
||||
defer wg.Wait()
|
||||
events := make(chan *uevent.Message)
|
||||
defer close(events)
|
||||
wg.Go(func() { s.Consume(t.Context(), events) })
|
||||
|
||||
events <- &uevent.Message{Action: uevent.KOBJ_ADD, DevPath: "\x00", Env: []string{
|
||||
"V=\xfd",
|
||||
"SEQNUM=0",
|
||||
}}
|
||||
events <- &uevent.Message{Action: uevent.KOBJ_ADD, DevPath: "\x01", Env: []string{
|
||||
"V=\xfc",
|
||||
"SEQNUM=1",
|
||||
}}
|
||||
synctest.Wait()
|
||||
s.Range(t.Context(), func(o *Object) bool { return false })
|
||||
|
||||
var got []*Object
|
||||
check := func(want []*Object) {
|
||||
slices.SortFunc(got, func(a, b *Object) int {
|
||||
return strings.Compare(a.DevPath, b.DevPath)
|
||||
})
|
||||
if !reflect.DeepEqual(got, want) {
|
||||
t.Fatalf("Range: %#v, want %#v", got, want)
|
||||
}
|
||||
got = nil
|
||||
}
|
||||
|
||||
ctx, cancel := context.WithCancel(t.Context())
|
||||
defer cancel()
|
||||
var done bool
|
||||
wg.Go(func() {
|
||||
s.Range(ctx, func(o *Object) bool {
|
||||
got = append(got, new(o.Clone()))
|
||||
return !done
|
||||
})
|
||||
})
|
||||
synctest.Wait()
|
||||
check([]*Object{
|
||||
{
|
||||
State: StateNew,
|
||||
DevPath: "\x00",
|
||||
Env: map[string]string{"V": "\xfd"},
|
||||
},
|
||||
{
|
||||
State: StateNew,
|
||||
DevPath: "\x01",
|
||||
Env: map[string]string{"V": "\xfc"},
|
||||
},
|
||||
})
|
||||
|
||||
done = true
|
||||
events <- &uevent.Message{Action: uevent.KOBJ_MOVE, DevPath: " ", Env: []string{
|
||||
"DEVPATH_OLD=\x01",
|
||||
}}
|
||||
synctest.Wait()
|
||||
check([]*Object{
|
||||
{
|
||||
State: StateNew,
|
||||
DevPath: " ",
|
||||
Env: map[string]string{"V": "\xfc"},
|
||||
},
|
||||
})
|
||||
|
||||
wg.Go(func() { s.Range(ctx, func(*Object) bool { return true }) })
|
||||
synctest.Wait()
|
||||
|
||||
iter := reflect.ValueOf(s).Elem().FieldByName("iter")
|
||||
if l := iter.Len(); l != 1 {
|
||||
t.Errorf("len(s.iter): %d", l)
|
||||
}
|
||||
|
||||
cancel()
|
||||
synctest.Wait()
|
||||
if l := iter.Len(); l != 0 {
|
||||
t.Errorf("len(s.iter): %d", l)
|
||||
}
|
||||
})
|
||||
}
|
||||
|
||||
func TestErrors(t *testing.T) {
|
||||
t.Parallel()
|
||||
|
||||
|
||||
Reference in New Issue
Block a user