gitea源码

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586
  1. // Copyright 2024 The Gitea Authors. All rights reserved.
  2. // SPDX-License-Identifier: MIT
  3. package actions
  4. import (
  5. "testing"
  6. "github.com/stretchr/testify/assert"
  7. )
  8. func TestAggregateJobStatus(t *testing.T) {
  9. testStatuses := func(expected Status, statuses []Status) {
  10. t.Helper()
  11. var jobs []*ActionRunJob
  12. for _, v := range statuses {
  13. jobs = append(jobs, &ActionRunJob{Status: v})
  14. }
  15. actual := AggregateJobStatus(jobs)
  16. if !assert.Equal(t, expected, actual) {
  17. var statusStrings []string
  18. for _, s := range statuses {
  19. statusStrings = append(statusStrings, s.String())
  20. }
  21. t.Errorf("AggregateJobStatus(%v) = %v, want %v", statusStrings, statusNames[actual], statusNames[expected])
  22. }
  23. }
  24. cases := []struct {
  25. statuses []Status
  26. expected Status
  27. }{
  28. // unknown cases, maybe it shouldn't happen in real world
  29. {[]Status{}, StatusUnknown},
  30. {[]Status{StatusUnknown, StatusSuccess}, StatusUnknown},
  31. {[]Status{StatusUnknown, StatusSkipped}, StatusUnknown},
  32. {[]Status{StatusUnknown, StatusFailure}, StatusFailure},
  33. {[]Status{StatusUnknown, StatusCancelled}, StatusCancelled},
  34. {[]Status{StatusUnknown, StatusWaiting}, StatusWaiting},
  35. {[]Status{StatusUnknown, StatusRunning}, StatusRunning},
  36. {[]Status{StatusUnknown, StatusBlocked}, StatusBlocked},
  37. // success with other status
  38. {[]Status{StatusSuccess}, StatusSuccess},
  39. {[]Status{StatusSuccess, StatusSkipped}, StatusSuccess}, // skipped doesn't affect success
  40. {[]Status{StatusSuccess, StatusFailure}, StatusFailure},
  41. {[]Status{StatusSuccess, StatusCancelled}, StatusCancelled},
  42. {[]Status{StatusSuccess, StatusWaiting}, StatusWaiting},
  43. {[]Status{StatusSuccess, StatusRunning}, StatusRunning},
  44. {[]Status{StatusSuccess, StatusBlocked}, StatusBlocked},
  45. // any cancelled, then cancelled
  46. {[]Status{StatusCancelled}, StatusCancelled},
  47. {[]Status{StatusCancelled, StatusSuccess}, StatusCancelled},
  48. {[]Status{StatusCancelled, StatusSkipped}, StatusCancelled},
  49. {[]Status{StatusCancelled, StatusFailure}, StatusCancelled},
  50. {[]Status{StatusCancelled, StatusWaiting}, StatusCancelled},
  51. {[]Status{StatusCancelled, StatusRunning}, StatusCancelled},
  52. {[]Status{StatusCancelled, StatusBlocked}, StatusCancelled},
  53. // failure with other status, usually fail fast, but "running" wins to match GitHub's behavior
  54. // another reason that we can't make "failure" wins over "running": it would cause a weird behavior that user cannot cancel a workflow or get current running workflows correctly by filter after a job fail.
  55. {[]Status{StatusFailure}, StatusFailure},
  56. {[]Status{StatusFailure, StatusSuccess}, StatusFailure},
  57. {[]Status{StatusFailure, StatusSkipped}, StatusFailure},
  58. {[]Status{StatusFailure, StatusCancelled}, StatusCancelled},
  59. {[]Status{StatusFailure, StatusWaiting}, StatusWaiting},
  60. {[]Status{StatusFailure, StatusRunning}, StatusRunning},
  61. {[]Status{StatusFailure, StatusBlocked}, StatusFailure},
  62. // skipped with other status
  63. // "all skipped" is also considered as "mergeable" by "services/actions.toCommitStatus", the same as GitHub
  64. {[]Status{StatusSkipped}, StatusSkipped},
  65. {[]Status{StatusSkipped, StatusSuccess}, StatusSuccess},
  66. {[]Status{StatusSkipped, StatusFailure}, StatusFailure},
  67. {[]Status{StatusSkipped, StatusCancelled}, StatusCancelled},
  68. {[]Status{StatusSkipped, StatusWaiting}, StatusWaiting},
  69. {[]Status{StatusSkipped, StatusRunning}, StatusRunning},
  70. {[]Status{StatusSkipped, StatusBlocked}, StatusBlocked},
  71. }
  72. for _, c := range cases {
  73. testStatuses(c.expected, c.statuses)
  74. }
  75. }