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) } }