api_queue_test.go 2.5 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586
  1. package api
  2. import (
  3. "context"
  4. "testing"
  5. "time"
  6. "connectrpc.com/connect"
  7. apiv1 "github.com/OliveTin/OliveTin/gen/olivetin/api/v1"
  8. config "github.com/OliveTin/OliveTin/internal/config"
  9. "github.com/OliveTin/OliveTin/internal/executor"
  10. "github.com/google/uuid"
  11. "github.com/stretchr/testify/assert"
  12. "github.com/stretchr/testify/require"
  13. )
  14. func TestGetExecutionQueueGroupsByBinding(t *testing.T) {
  15. cfg := config.DefaultConfig()
  16. cfg.Actions = []*config.Action{
  17. {Title: "backup", Shell: "sleep 1", MaxConcurrent: 1},
  18. {Title: "ping", Shell: "echo ping"},
  19. }
  20. cfg.Sanitize()
  21. ex := executor.DefaultExecutor(cfg)
  22. ex.RebuildActionMap()
  23. backupBinding := ex.FindBindingWithNoEntity(cfg.Actions[0])
  24. pingBinding := ex.FindBindingWithNoEntity(cfg.Actions[1])
  25. require.NotNil(t, backupBinding)
  26. require.NotNil(t, pingBinding)
  27. backupRunning := newAPIQueueLogEntry(backupBinding, true, false)
  28. backupWaiting := newAPIQueueLogEntry(backupBinding, false, false)
  29. pingRunning := newAPIQueueLogEntry(pingBinding, true, false)
  30. ex.SetLog(backupRunning.ExecutionTrackingID, backupRunning)
  31. ex.SetLog(backupWaiting.ExecutionTrackingID, backupWaiting)
  32. ex.SetLog(pingRunning.ExecutionTrackingID, pingRunning)
  33. ts, client := getNewTestServerAndClientWithExecutor(cfg, ex)
  34. defer ts.Close()
  35. resp, err := client.GetExecutionQueue(context.Background(), connect.NewRequest(&apiv1.GetExecutionQueueRequest{}))
  36. require.NoError(t, err)
  37. require.NotNil(t, resp)
  38. assert.Equal(t, int32(3), resp.Msg.TotalActive)
  39. require.Len(t, resp.Msg.Groups, 2)
  40. var backupGroup *apiv1.ExecutionQueueGroup
  41. for _, group := range resp.Msg.Groups {
  42. if group.BindingId == backupBinding.ID {
  43. backupGroup = group
  44. }
  45. }
  46. require.NotNil(t, backupGroup)
  47. assert.Equal(t, "backup", backupGroup.ActionTitle)
  48. assert.Equal(t, int32(1), backupGroup.MaxConcurrent)
  49. assert.Equal(t, int32(2), backupGroup.ActiveCount)
  50. require.Len(t, backupGroup.Entries, 2)
  51. assert.False(t, backupGroup.Entries[1].ExecutionStarted)
  52. assert.True(t, backupGroup.Entries[0].ExecutionStarted)
  53. }
  54. func newAPIQueueLogEntry(binding *executor.ActionBinding, started bool, finished bool) *executor.InternalLogEntry {
  55. startedAt := time.Now().Add(-time.Minute)
  56. if started {
  57. startedAt = time.Now().Add(-2 * time.Minute)
  58. }
  59. entry := &executor.InternalLogEntry{
  60. Binding: binding,
  61. DatetimeStarted: startedAt,
  62. ExecutionTrackingID: uuid.NewString(),
  63. ActionTitle: binding.Action.Title,
  64. ExecutionStarted: started,
  65. ExecutionFinished: finished,
  66. }
  67. if finished {
  68. entry.DatetimeFinished = time.Now()
  69. }
  70. return entry
  71. }