pipeline_test.go 6.5 KB

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