pipeline_test.go 6.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225
  1. package hercules
  2. import (
  3. "errors"
  4. "io/ioutil"
  5. "os"
  6. "testing"
  7. "github.com/stretchr/testify/assert"
  8. "gopkg.in/src-d/go-git.v4"
  9. "gopkg.in/src-d/go-git.v4/plumbing"
  10. "gopkg.in/src-d/go-git.v4/plumbing/object"
  11. "gopkg.in/src-d/go-git.v4/storage/memory"
  12. )
  13. type testPipelineItem struct {
  14. Initialized bool
  15. DepsConsumed bool
  16. CommitMatches bool
  17. IndexMatches bool
  18. TestError bool
  19. }
  20. func (item *testPipelineItem) Name() string {
  21. return "Test"
  22. }
  23. func (item *testPipelineItem) Provides() []string {
  24. arr := [...]string{"test"}
  25. return arr[:]
  26. }
  27. func (item *testPipelineItem) Requires() []string {
  28. return []string{}
  29. }
  30. func (item *testPipelineItem) Initialize(repository *git.Repository) {
  31. item.Initialized = repository != nil
  32. }
  33. func (item *testPipelineItem) Consume(deps map[string]interface{}) (map[string]interface{}, error) {
  34. if item.TestError {
  35. return nil, errors.New("error")
  36. }
  37. obj, exists := deps["commit"]
  38. item.DepsConsumed = exists
  39. if item.DepsConsumed {
  40. commit := obj.(*object.Commit)
  41. item.CommitMatches = commit.Hash == plumbing.NewHash(
  42. "af9ddc0db70f09f3f27b4b98e415592a7485171c")
  43. obj, item.DepsConsumed = deps["index"]
  44. if item.DepsConsumed {
  45. item.IndexMatches = obj.(int) == 0
  46. }
  47. }
  48. return map[string]interface{}{"test": item}, nil
  49. }
  50. func (item *testPipelineItem) Finalize() interface{} {
  51. return item
  52. }
  53. type dependingTestPipelineItem struct {
  54. DependencySatisfied bool
  55. TestNilConsumeReturn bool
  56. }
  57. func (item *dependingTestPipelineItem) Name() string {
  58. return "Test2"
  59. }
  60. func (item *dependingTestPipelineItem) Provides() []string {
  61. arr := [...]string{"test2"}
  62. return arr[:]
  63. }
  64. func (item *dependingTestPipelineItem) Requires() []string {
  65. arr := [...]string{"test"}
  66. return arr[:]
  67. }
  68. func (item *dependingTestPipelineItem) Initialize(repository *git.Repository) {
  69. }
  70. func (item *dependingTestPipelineItem) Consume(deps map[string]interface{}) (map[string]interface{}, error) {
  71. _, exists := deps["test"]
  72. item.DependencySatisfied = exists
  73. if !item.TestNilConsumeReturn {
  74. return map[string]interface{}{"test2": item}, nil
  75. } else {
  76. return nil, nil
  77. }
  78. }
  79. func (item *dependingTestPipelineItem) Finalize() interface{} {
  80. return item.DependencySatisfied
  81. }
  82. func TestPipelineRun(t *testing.T) {
  83. pipeline := NewPipeline(testRepository)
  84. item := &testPipelineItem{}
  85. pipeline.AddItem(item)
  86. pipeline.Initialize()
  87. assert.True(t, item.Initialized)
  88. commits := make([]*object.Commit, 1)
  89. commits[0], _ = testRepository.CommitObject(plumbing.NewHash(
  90. "af9ddc0db70f09f3f27b4b98e415592a7485171c"))
  91. result, err := pipeline.Run(commits)
  92. assert.Nil(t, err)
  93. assert.Equal(t, item, result[item].(*testPipelineItem))
  94. assert.True(t, item.DepsConsumed)
  95. assert.True(t, item.CommitMatches)
  96. assert.True(t, item.IndexMatches)
  97. pipeline.RemoveItem(item)
  98. result, err = pipeline.Run(commits)
  99. assert.Nil(t, err)
  100. assert.Equal(t, 0, len(result))
  101. }
  102. func TestPipelineOnProgress(t *testing.T) {
  103. pipeline := NewPipeline(testRepository)
  104. var progressOk1, progressOk2 bool
  105. onProgress := func(step int, total int) {
  106. if step == 0 && total == 1 {
  107. progressOk1 = true
  108. }
  109. if step == 1 && total == 1 && progressOk1 {
  110. progressOk2 = true
  111. }
  112. }
  113. pipeline.OnProgress = onProgress
  114. commits := make([]*object.Commit, 1)
  115. commits[0], _ = testRepository.CommitObject(plumbing.NewHash(
  116. "af9ddc0db70f09f3f27b4b98e415592a7485171c"))
  117. result, err := pipeline.Run(commits)
  118. assert.Nil(t, err)
  119. assert.Equal(t, 0, len(result))
  120. assert.True(t, progressOk1)
  121. assert.True(t, progressOk2)
  122. }
  123. func TestPipelineCommits(t *testing.T) {
  124. pipeline := NewPipeline(testRepository)
  125. commits := pipeline.Commits()
  126. assert.True(t, len(commits) >= 90)
  127. assert.Equal(t, commits[0].Hash, plumbing.NewHash(
  128. "cce947b98a050c6d356bc6ba95030254914027b1"))
  129. assert.Equal(t, commits[89].Hash, plumbing.NewHash(
  130. "6db8065cdb9bb0758f36a7e75fc72ab95f9e8145"))
  131. assert.NotEqual(t, commits[len(commits)-1], commits[len(commits)-2])
  132. }
  133. func TestLoadCommitsFromFile(t *testing.T) {
  134. tmp, err := ioutil.TempFile("", "hercules-test-")
  135. assert.Nil(t, err)
  136. tmp.WriteString("cce947b98a050c6d356bc6ba95030254914027b1\n6db8065cdb9bb0758f36a7e75fc72ab95f9e8145")
  137. tmp.Close()
  138. defer os.Remove(tmp.Name())
  139. commits, err := LoadCommitsFromFile(tmp.Name(), testRepository)
  140. assert.Nil(t, err)
  141. assert.Equal(t, len(commits), 2)
  142. assert.Equal(t, commits[0].Hash, plumbing.NewHash(
  143. "cce947b98a050c6d356bc6ba95030254914027b1"))
  144. assert.Equal(t, commits[1].Hash, plumbing.NewHash(
  145. "6db8065cdb9bb0758f36a7e75fc72ab95f9e8145"))
  146. commits, err = LoadCommitsFromFile("/WAT?xxx!", testRepository)
  147. assert.Nil(t, commits)
  148. assert.NotNil(t, err)
  149. tmp, err = ioutil.TempFile("", "hercules-test-")
  150. assert.Nil(t, err)
  151. tmp.WriteString("WAT")
  152. tmp.Close()
  153. defer os.Remove(tmp.Name())
  154. commits, err = LoadCommitsFromFile(tmp.Name(), testRepository)
  155. assert.Nil(t, commits)
  156. assert.NotNil(t, err)
  157. tmp, err = ioutil.TempFile("", "hercules-test-")
  158. assert.Nil(t, err)
  159. tmp.WriteString("ffffffffffffffffffffffffffffffffffffffff")
  160. tmp.Close()
  161. defer os.Remove(tmp.Name())
  162. commits, err = LoadCommitsFromFile(tmp.Name(), testRepository)
  163. assert.Nil(t, commits)
  164. assert.NotNil(t, err)
  165. }
  166. func TestPipelineDeps(t *testing.T) {
  167. pipeline := NewPipeline(testRepository)
  168. item1 := &dependingTestPipelineItem{}
  169. item2 := &testPipelineItem{}
  170. pipeline.AddItem(item1)
  171. pipeline.AddItem(item2)
  172. pipeline.Initialize()
  173. commits := make([]*object.Commit, 1)
  174. commits[0], _ = testRepository.CommitObject(plumbing.NewHash(
  175. "af9ddc0db70f09f3f27b4b98e415592a7485171c"))
  176. result, err := pipeline.Run(commits)
  177. assert.Nil(t, err)
  178. assert.True(t, result[item1].(bool))
  179. item1.TestNilConsumeReturn = true
  180. assert.Panics(t, func() { pipeline.Run(commits) })
  181. }
  182. func TestPipelineError(t *testing.T) {
  183. pipeline := NewPipeline(testRepository)
  184. item := &testPipelineItem{}
  185. item.TestError = true
  186. pipeline.AddItem(item)
  187. pipeline.Initialize()
  188. commits := make([]*object.Commit, 1)
  189. commits[0], _ = testRepository.CommitObject(plumbing.NewHash(
  190. "af9ddc0db70f09f3f27b4b98e415592a7485171c"))
  191. result, err := pipeline.Run(commits)
  192. assert.Nil(t, result)
  193. assert.NotNil(t, err)
  194. }
  195. func init() {
  196. testRepository, _ = git.Clone(memory.NewStorage(), nil, &git.CloneOptions{
  197. URL: "https://github.com/src-d/hercules",
  198. })
  199. }