graphvent/lockable_test.go

187 lines
5.0 KiB
Go

2023-07-27 16:21:27 -06:00
package graphvent
import (
"testing"
"time"
2023-08-11 16:00:36 -06:00
"crypto/ed25519"
"crypto/rand"
2023-07-27 16:21:27 -06:00
)
var TestLockableType = NewNodeType("TEST_LOCKABLE")
func lockableTestContext(t *testing.T, logs []string) *Context {
ctx := logTestContext(t, logs)
err := ctx.RegisterNodeType(TestLockableType, []ExtType{LockableExtType})
2023-07-27 16:21:27 -06:00
fatalErr(t, err)
return ctx
}
func TestLink(t *testing.T) {
ctx := lockableTestContext(t, []string{"lockable"})
2023-08-11 16:00:36 -06:00
l1_pub, l1_key, err := ed25519.GenerateKey(rand.Reader)
fatalErr(t, err)
l1_id := KeyID(l1_pub)
policy := NewPerNodePolicy(map[NodeID]Tree{
l1_id: nil,
})
l2_listener := NewListenerExt(10)
2023-08-31 22:31:29 -06:00
l2, err := NewNode(ctx, nil, TestLockableType, 10,
2023-08-11 16:00:36 -06:00
map[PolicyType]Policy{
PerNodePolicyType: &policy,
},
l2_listener,
NewLockableExt(nil),
)
2023-08-31 22:31:29 -06:00
fatalErr(t, err)
2023-08-11 16:00:36 -06:00
l1_listener := NewListenerExt(10)
2023-08-31 22:31:29 -06:00
l1, err := NewNode(ctx, l1_key, TestLockableType, 10, nil,
l1_listener,
NewLockableExt(nil),
)
2023-08-31 22:31:29 -06:00
fatalErr(t, err)
2023-07-27 18:16:37 -06:00
msgs := Messages{}
msgs = msgs.Add(ctx, l1.ID, l1.Key, NewLinkSignal("add", l2.ID), l1.ID)
err = ctx.Send(msgs)
fatalErr(t, err)
_, err = WaitForSignal(l1_listener.Chan, time.Millisecond*10, func(sig *ErrorSignal) bool {
return sig.Error == "req_added"
})
fatalErr(t, err)
msgs = Messages{}
msgs = msgs.Add(ctx, l1.ID, l1.Key, NewLinkSignal("remove", l2.ID), l1.ID)
2023-08-11 16:00:36 -06:00
err = ctx.Send(msgs)
2023-07-27 18:16:37 -06:00
fatalErr(t, err)
_, err = WaitForSignal(l1_listener.Chan, time.Millisecond*10, func(sig *ErrorSignal) bool {
return sig.Error == "req_removed"
})
fatalErr(t, err)
}
func Test10KLink(t *testing.T) {
2023-08-11 16:00:36 -06:00
ctx := lockableTestContext(t, []string{"test"})
2023-08-11 16:00:36 -06:00
l_pub, listener_key, err := ed25519.GenerateKey(rand.Reader)
fatalErr(t, err)
listener_id := KeyID(l_pub)
child_policy := NewPerNodePolicy(map[NodeID]Tree{
listener_id: Tree{
uint64(LockSignalType): nil,
2023-08-11 16:00:36 -06:00
},
})
NewLockable := func()(*Node) {
2023-08-31 22:31:29 -06:00
l, err := NewNode(ctx, nil, TestLockableType, 10,
2023-08-11 16:00:36 -06:00
map[PolicyType]Policy{
PerNodePolicyType: &child_policy,
},
NewLockableExt(nil),
)
2023-08-31 22:31:29 -06:00
fatalErr(t, err)
return l
}
2023-08-11 16:00:36 -06:00
reqs := make([]NodeID, 1000)
for i, _ := range(reqs) {
new_lockable := NewLockable()
reqs[i] = new_lockable.ID
}
ctx.Log.Logf("test", "CREATED_10K")
2023-08-11 16:00:36 -06:00
l_policy := NewAllNodesPolicy(Tree{
uint64(LockSignalType): nil,
2023-08-11 16:00:36 -06:00
})
listener := NewListenerExt(100000)
2023-08-31 22:31:29 -06:00
node, err := NewNode(ctx, listener_key, TestLockableType, 10000,
2023-08-11 16:00:36 -06:00
map[PolicyType]Policy{
AllNodesPolicyType: &l_policy,
},
listener,
NewLockableExt(reqs),
)
2023-08-31 22:31:29 -06:00
fatalErr(t, err)
ctx.Log.Logf("test", "CREATED_LISTENER")
2023-08-15 18:23:06 -06:00
_, err = LockLockable(ctx, node, node.ID)
2023-08-11 16:00:36 -06:00
fatalErr(t, err)
_, err = WaitForSignal(listener.Chan, time.Millisecond*1000, func(sig *LockSignal) bool {
return sig.State == "locked"
2023-08-11 16:00:36 -06:00
})
fatalErr(t, err)
for _, _ = range(reqs) {
_, err := WaitForSignal(listener.Chan, time.Millisecond*100, func(sig *LockSignal) bool {
return sig.State == "locked"
2023-08-11 16:00:36 -06:00
})
fatalErr(t, err)
}
ctx.Log.Logf("test", "LOCKED_10K")
}
func TestLock(t *testing.T) {
2023-08-15 18:23:06 -06:00
ctx := lockableTestContext(t, []string{"lockable"})
2023-08-11 16:00:36 -06:00
policy := NewAllNodesPolicy(nil)
NewLockable := func(reqs []NodeID)(*Node, *ListenerExt) {
listener := NewListenerExt(100)
2023-08-31 22:31:29 -06:00
l, err := NewNode(ctx, nil, TestLockableType, 10,
2023-08-11 16:00:36 -06:00
map[PolicyType]Policy{
AllNodesPolicyType: &policy,
},
listener,
NewLockableExt(reqs),
)
2023-08-31 22:31:29 -06:00
fatalErr(t, err)
return l, listener
}
l2, _ := NewLockable(nil)
l3, _ := NewLockable(nil)
l4, _ := NewLockable(nil)
l5, _ := NewLockable(nil)
2023-08-15 18:23:06 -06:00
l0, l0_listener := NewLockable([]NodeID{l2.ID, l3.ID, l4.ID, l5.ID})
l1, l1_listener := NewLockable([]NodeID{l2.ID, l3.ID, l4.ID, l5.ID})
locked := func(sig *LockSignal) bool {
return sig.State == "locked"
}
unlocked := func(sig *LockSignal) bool {
return sig.State == "unlocked"
2023-08-15 18:23:06 -06:00
}
_, err := LockLockable(ctx, l0, l5.ID)
fatalErr(t, err)
_, err = WaitForSignal(l0_listener.Chan, time.Millisecond*10, locked)
fatalErr(t, err)
2023-08-15 18:23:06 -06:00
id, err := LockLockable(ctx, l1, l1.ID)
fatalErr(t, err)
_, err = WaitForSignal(l1_listener.Chan, time.Millisecond*10, func(sig *ErrorSignal) bool {
return sig.Error == "not_unlocked" && sig.Header().ReqID == id
2023-08-15 18:23:06 -06:00
})
fatalErr(t, err)
2023-08-15 18:23:06 -06:00
_, err = UnlockLockable(ctx, l0, l5.ID)
fatalErr(t, err)
_, err = WaitForSignal(l0_listener.Chan, time.Millisecond*10, unlocked)
fatalErr(t, err)
2023-08-15 18:23:06 -06:00
_, err = LockLockable(ctx, l1, l1.ID)
fatalErr(t, err)
2023-08-15 18:23:06 -06:00
for i := 0; i < 4; i++ {
_, err = WaitForSignal(l1_listener.Chan, time.Millisecond*10, func(sig *LockSignal) bool {
return sig.State == "locked"
2023-08-15 18:23:06 -06:00
})
fatalErr(t, err)
}
}