100 lines
2.4 KiB
Go
100 lines
2.4 KiB
Go
|
package testsuite
|
||
|
|
||
|
import (
|
||
|
"context"
|
||
|
"fmt"
|
||
|
"testing"
|
||
|
"time"
|
||
|
|
||
|
"forge.cadoles.com/cadoles/bouncer/internal/proxy/director/layer/queue"
|
||
|
"github.com/pkg/errors"
|
||
|
)
|
||
|
|
||
|
type adapterTestCase struct {
|
||
|
Name string
|
||
|
Do func(adapter queue.Adapter) error
|
||
|
}
|
||
|
|
||
|
var adapterTestCases = []adapterTestCase{
|
||
|
{
|
||
|
Name: "Test queue ranking",
|
||
|
Do: func(adapter queue.Adapter) error {
|
||
|
ctx := context.Background()
|
||
|
queueName := "test_queue_ranking"
|
||
|
|
||
|
sessionIdPattern := "session-%d"
|
||
|
totalSessions := int64(100)
|
||
|
|
||
|
for idx := int64(0); idx < totalSessions; idx++ {
|
||
|
sessionId := fmt.Sprintf(sessionIdPattern, idx)
|
||
|
rank, err := adapter.Touch(ctx, queueName, sessionId)
|
||
|
if err != nil {
|
||
|
return errors.Wrapf(err, "could not touch session '%s' (index: %d, rank: %d)", sessionId, idx, rank)
|
||
|
}
|
||
|
|
||
|
if e, g := int64(idx), rank; e != g {
|
||
|
return errors.Errorf("rank('%s'): expected '%v', got '%v'", sessionId, e, g)
|
||
|
}
|
||
|
}
|
||
|
|
||
|
status, err := adapter.Status(ctx, queueName)
|
||
|
if err != nil {
|
||
|
return errors.Wrap(err, "could not retrieve queue status")
|
||
|
}
|
||
|
|
||
|
if e, g := totalSessions, status.Sessions; e != g {
|
||
|
return errors.Errorf("status.Sessions: expected '%v', got '%v'", e, g)
|
||
|
}
|
||
|
|
||
|
return nil
|
||
|
},
|
||
|
},
|
||
|
{
|
||
|
Name: "Test session expiration",
|
||
|
Do: func(adapter queue.Adapter) error {
|
||
|
ctx := context.Background()
|
||
|
queueName := "test_session_expiration"
|
||
|
|
||
|
sessionId := "session-1"
|
||
|
|
||
|
rank, err := adapter.Touch(ctx, queueName, sessionId)
|
||
|
if err != nil {
|
||
|
return errors.Wrapf(err, "could not touch session '%s'", sessionId)
|
||
|
}
|
||
|
|
||
|
if e, g := int64(0), rank; e != g {
|
||
|
return errors.Errorf("rank('%s'): expected '%v', got '%v'", sessionId, e, g)
|
||
|
}
|
||
|
|
||
|
<-time.After(time.Second)
|
||
|
|
||
|
if err := adapter.Refresh(ctx, queueName, time.Second); err != nil {
|
||
|
return errors.Wrap(err, "could not refresh queue")
|
||
|
}
|
||
|
|
||
|
status, err := adapter.Status(ctx, queueName)
|
||
|
if err != nil {
|
||
|
return errors.Wrap(err, "could not retrieve queue status")
|
||
|
}
|
||
|
|
||
|
if e, g := int64(0), status.Sessions; e != g {
|
||
|
return errors.Errorf("status.Sessions: expected '%v', got '%v'", e, g)
|
||
|
}
|
||
|
|
||
|
return nil
|
||
|
},
|
||
|
},
|
||
|
}
|
||
|
|
||
|
func TestAdapter(t *testing.T, adapter queue.Adapter) {
|
||
|
for _, tc := range adapterTestCases {
|
||
|
func(tc adapterTestCase) {
|
||
|
t.Run(tc.Name, func(t *testing.T) {
|
||
|
if err := tc.Do(adapter); err != nil {
|
||
|
t.Fatalf("%+v", errors.WithStack(err))
|
||
|
}
|
||
|
})
|
||
|
}(tc)
|
||
|
}
|
||
|
}
|