graphvent/graph_test.go

125 lines
3.2 KiB
Go

2023-06-18 18:33:17 -06:00
package graphvent
2023-04-08 15:23:40 -06:00
import (
"testing"
2023-05-29 23:54:52 -06:00
"fmt"
"time"
2023-06-03 18:56:14 -06:00
"runtime/pprof"
"runtime/debug"
"os"
2023-06-22 15:50:42 -06:00
badger "github.com/dgraph-io/badger/v3"
2023-04-08 15:23:40 -06:00
)
2023-06-18 18:39:52 -06:00
type GraphTester testing.T
const listner_timeout = 50 * time.Millisecond
2023-04-08 15:23:40 -06:00
func (t * GraphTester) WaitForState(ctx * Context, listener *ListenerExt, stype SignalType, state string, timeout time.Duration, str string) Signal {
timeout_channel := time.After(timeout)
for true {
select {
case signal := <- listener.Chan:
if signal == nil {
ctx.Log.Logf("test", "SIGNAL_CHANNEL_CLOSED: %s", listener)
t.Fatal(str)
}
if signal.Type() == stype {
sig, ok := signal.(StateSignal)
if ok == true {
ctx.Log.Logf("test", "%s state received: %s", stype, sig.State)
if sig.State == state {
return signal
}
}
}
case <-timeout_channel:
pprof.Lookup("goroutine").WriteTo(os.Stdout, 1)
t.Fatal(str)
return nil
}
}
return nil
}
func (t * GraphTester) WaitForStatus(ctx * Context, listener *ListenerExt, status string, timeout time.Duration, str string) Signal {
2023-06-03 02:07:16 -06:00
timeout_channel := time.After(timeout)
for true {
select {
case signal := <- listener.Chan:
2023-06-24 19:48:59 -06:00
if signal == nil {
ctx.Log.Logf("test", "SIGNAL_CHANNEL_CLOSED: %s", listener)
t.Fatal(str)
}
2023-07-27 18:16:37 -06:00
if signal.Type() == StatusSignalType {
sig, ok := signal.(StatusSignal)
if ok == true {
2023-07-27 00:30:24 -06:00
ctx.Log.Logf("test", "Status received: %s", sig.Status)
if sig.Status == status {
return signal
}
} else {
ctx.Log.Logf("test", "Failed to cast status to StatusSignal: %+v", signal)
}
2023-06-03 02:07:16 -06:00
}
case <-timeout_channel:
2023-06-03 18:56:14 -06:00
pprof.Lookup("goroutine").WriteTo(os.Stdout, 1)
2023-06-03 02:07:16 -06:00
t.Fatal(str)
return nil
}
}
return nil
}
func (t * GraphTester) CheckForNone(listener *ListenerExt, str string) {
2023-04-08 15:23:40 -06:00
timeout := time.After(listner_timeout)
select {
case sig := <- listener.Chan:
2023-06-03 18:56:14 -06:00
pprof.Lookup("goroutine").WriteTo(os.Stdout, 1)
t.Fatal(fmt.Sprintf("%s : %+v", str, sig))
2023-06-03 01:38:35 -06:00
case <-timeout:
2023-04-08 15:23:40 -06:00
}
}
2023-07-27 00:30:24 -06:00
const SimpleListenerNodeType = NodeType("SIMPLE_LISTENER")
func NewSimpleListener(ctx *Context, buffer int) (*Node, *ListenerExt) {
policy := NewAllNodesPolicy(Actions{MakeAction("status")})
2023-07-27 00:30:24 -06:00
listener_extension := NewListenerExt(buffer)
2023-07-27 11:33:11 -06:00
listener := NewNode(ctx,
RandID(),
SimpleListenerNodeType,
nil,
2023-07-27 11:33:11 -06:00
listener_extension,
NewACLExt(&policy),
NewLockableExt())
2023-07-27 00:30:24 -06:00
return listener, listener_extension
}
2023-07-25 21:43:15 -06:00
func logTestContext(t * testing.T, components []string) *Context {
db, err := badger.Open(badger.DefaultOptions("").WithInMemory(true))
if err != nil {
t.Fatal(err)
}
2023-07-25 21:43:15 -06:00
ctx, err := NewContext(db, NewConsoleLogger(components))
fatalErr(t, err)
2023-07-27 00:30:24 -06:00
err = ctx.RegisterNodeType(SimpleListenerNodeType, []ExtType{ACLExtType, ListenerExtType, LockableExtType})
2023-07-27 00:30:24 -06:00
fatalErr(t, err)
2023-07-25 21:43:15 -06:00
return ctx
}
2023-07-09 14:30:30 -06:00
func testContext(t * testing.T) * Context {
2023-07-27 00:30:24 -06:00
return logTestContext(t, []string{})
}
func fatalErr(t * testing.T, err error) {
if err != nil {
debug.PrintStack()
t.Fatal(err)
}
}