pipeline_test.go 5.6 KB

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