tree_diff_test.go 6.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197
  1. package plumbing
  2. import (
  3. "testing"
  4. "github.com/stretchr/testify/assert"
  5. "gopkg.in/src-d/go-git.v4/plumbing"
  6. "gopkg.in/src-d/go-git.v4/plumbing/object"
  7. "gopkg.in/src-d/go-git.v4/utils/merkletrie"
  8. "gopkg.in/src-d/hercules.v4/internal/core"
  9. "gopkg.in/src-d/hercules.v4/internal/test"
  10. )
  11. func fixtureTreeDiff() *TreeDiff {
  12. td := TreeDiff{}
  13. td.Configure(nil)
  14. td.Initialize(test.Repository)
  15. return &td
  16. }
  17. func TestTreeDiffMeta(t *testing.T) {
  18. td := fixtureTreeDiff()
  19. assert.Equal(t, td.Name(), "TreeDiff")
  20. assert.Equal(t, len(td.Requires()), 0)
  21. assert.Equal(t, len(td.Provides()), 1)
  22. assert.Equal(t, td.Provides()[0], DependencyTreeChanges)
  23. opts := td.ListConfigurationOptions()
  24. assert.Len(t, opts, 3)
  25. }
  26. func TestTreeDiffRegistration(t *testing.T) {
  27. summoned := core.Registry.Summon((&TreeDiff{}).Name())
  28. assert.Len(t, summoned, 1)
  29. assert.Equal(t, summoned[0].Name(), "TreeDiff")
  30. summoned = core.Registry.Summon((&TreeDiff{}).Provides()[0])
  31. assert.True(t, len(summoned) >= 1)
  32. matched := false
  33. for _, tp := range summoned {
  34. matched = matched || tp.Name() == "TreeDiff"
  35. }
  36. assert.True(t, matched)
  37. }
  38. func TestTreeDiffConsume(t *testing.T) {
  39. td := fixtureTreeDiff()
  40. commit, _ := test.Repository.CommitObject(plumbing.NewHash(
  41. "2b1ed978194a94edeabbca6de7ff3b5771d4d665"))
  42. deps := map[string]interface{}{}
  43. deps[core.DependencyCommit] = commit
  44. prevCommit, _ := test.Repository.CommitObject(plumbing.NewHash(
  45. "fbe766ffdc3f87f6affddc051c6f8b419beea6a2"))
  46. td.previousTree, _ = prevCommit.Tree()
  47. res, err := td.Consume(deps)
  48. assert.Nil(t, err)
  49. assert.Equal(t, len(res), 1)
  50. changes := res[DependencyTreeChanges].(object.Changes)
  51. assert.Equal(t, len(changes), 12)
  52. baseline := map[string]merkletrie.Action{
  53. "analyser.go": merkletrie.Delete,
  54. "cmd/hercules/main.go": merkletrie.Modify,
  55. "blob_cache.go": merkletrie.Insert,
  56. "burndown.go": merkletrie.Insert,
  57. "day.go": merkletrie.Insert,
  58. "dummies.go": merkletrie.Insert,
  59. "identity.go": merkletrie.Insert,
  60. "pipeline.go": merkletrie.Insert,
  61. "renames.go": merkletrie.Insert,
  62. "toposort/toposort.go": merkletrie.Insert,
  63. "toposort/toposort_test.go": merkletrie.Insert,
  64. "tree_diff.go": merkletrie.Insert,
  65. }
  66. for _, change := range changes {
  67. action, err := change.Action()
  68. assert.Nil(t, err)
  69. if change.From.Name != "" {
  70. assert.Contains(t, baseline, change.From.Name)
  71. assert.Equal(t, baseline[change.From.Name], action)
  72. } else {
  73. assert.Contains(t, baseline, change.To.Name)
  74. assert.Equal(t, baseline[change.To.Name], action)
  75. }
  76. }
  77. }
  78. func TestTreeDiffConsumeFirst(t *testing.T) {
  79. td := fixtureTreeDiff()
  80. commit, _ := test.Repository.CommitObject(plumbing.NewHash(
  81. "2b1ed978194a94edeabbca6de7ff3b5771d4d665"))
  82. deps := map[string]interface{}{}
  83. deps[core.DependencyCommit] = commit
  84. res, err := td.Consume(deps)
  85. assert.Nil(t, err)
  86. assert.Equal(t, len(res), 1)
  87. changes := res[DependencyTreeChanges].(object.Changes)
  88. assert.Equal(t, len(changes), 21)
  89. for _, change := range changes {
  90. action, err := change.Action()
  91. assert.Nil(t, err)
  92. assert.Equal(t, action, merkletrie.Insert)
  93. }
  94. }
  95. func TestTreeDiffBadCommit(t *testing.T) {
  96. td := fixtureTreeDiff()
  97. commit, _ := test.Repository.CommitObject(plumbing.NewHash(
  98. "2b1ed978194a94edeabbca6de7ff3b5771d4d665"))
  99. commit.TreeHash = plumbing.NewHash("0000000000000000000000000000000000000000")
  100. deps := map[string]interface{}{}
  101. deps[core.DependencyCommit] = commit
  102. res, err := td.Consume(deps)
  103. assert.Nil(t, res)
  104. assert.NotNil(t, err)
  105. }
  106. func TestTreeDiffConsumeSkip(t *testing.T) {
  107. // consume without skiping
  108. td := fixtureTreeDiff()
  109. assert.Contains(t, td.Languages, allLanguages)
  110. commit, _ := test.Repository.CommitObject(plumbing.NewHash(
  111. "aefdedf7cafa6ee110bae9a3910bf5088fdeb5a9"))
  112. deps := map[string]interface{}{}
  113. deps[core.DependencyCommit] = commit
  114. prevCommit, _ := test.Repository.CommitObject(plumbing.NewHash(
  115. "1e076dc56989bc6aa1ef5f55901696e9e01423d4"))
  116. td.previousTree, _ = prevCommit.Tree()
  117. res, err := td.Consume(deps)
  118. assert.Nil(t, err)
  119. assert.Equal(t, len(res), 1)
  120. changes := res[DependencyTreeChanges].(object.Changes)
  121. assert.Equal(t, 37, len(changes))
  122. // consume with skipping
  123. td = fixtureTreeDiff()
  124. td.previousTree, _ = prevCommit.Tree()
  125. td.Configure(map[string]interface{}{
  126. ConfigTreeDiffEnableBlacklist: true,
  127. ConfigTreeDiffBlacklistedPrefixes: []string{"vendor/"},
  128. })
  129. res, err = td.Consume(deps)
  130. assert.Nil(t, err)
  131. assert.Equal(t, len(res), 1)
  132. changes = res[DependencyTreeChanges].(object.Changes)
  133. assert.Equal(t, 31, len(changes))
  134. }
  135. func TestTreeDiffConsumeLanguageFilterFirst(t *testing.T) {
  136. td := fixtureTreeDiff()
  137. td.Configure(map[string]interface{}{ConfigTreeDiffLanguages: "Go"})
  138. commit, _ := test.Repository.CommitObject(plumbing.NewHash(
  139. "fbe766ffdc3f87f6affddc051c6f8b419beea6a2"))
  140. deps := map[string]interface{}{}
  141. deps[core.DependencyCommit] = commit
  142. res, err := td.Consume(deps)
  143. assert.Nil(t, err)
  144. assert.Equal(t, len(res), 1)
  145. changes := res[DependencyTreeChanges].(object.Changes)
  146. assert.Equal(t, len(changes), 6)
  147. assert.Equal(t, changes[0].To.Name, "analyser.go")
  148. assert.Equal(t, changes[1].To.Name, "cmd/hercules/main.go")
  149. assert.Equal(t, changes[2].To.Name, "doc.go")
  150. assert.Equal(t, changes[3].To.Name, "file.go")
  151. assert.Equal(t, changes[4].To.Name, "file_test.go")
  152. assert.Equal(t, changes[5].To.Name, "rbtree.go")
  153. }
  154. func TestTreeDiffConsumeLanguageFilter(t *testing.T) {
  155. td := fixtureTreeDiff()
  156. td.Configure(map[string]interface{}{ConfigTreeDiffLanguages: "Python"})
  157. commit, _ := test.Repository.CommitObject(plumbing.NewHash(
  158. "e89c1d10fb31e32668ad905eb59dc44d7a4a021e"))
  159. deps := map[string]interface{}{}
  160. deps[core.DependencyCommit] = commit
  161. res, err := td.Consume(deps)
  162. assert.Nil(t, err)
  163. assert.Equal(t, len(res), 1)
  164. commit, _ = test.Repository.CommitObject(plumbing.NewHash(
  165. "fbe766ffdc3f87f6affddc051c6f8b419beea6a2"))
  166. deps[core.DependencyCommit] = commit
  167. res, err = td.Consume(deps)
  168. assert.Nil(t, err)
  169. assert.Equal(t, len(res), 1)
  170. changes := res[DependencyTreeChanges].(object.Changes)
  171. assert.Equal(t, len(changes), 1)
  172. assert.Equal(t, changes[0].To.Name, "labours.py")
  173. }
  174. func TestTreeDiffFork(t *testing.T) {
  175. td1 := fixtureTreeDiff()
  176. td1.SkipDirs = append(td1.SkipDirs, "skip")
  177. clones := td1.Fork(1)
  178. assert.Len(t, clones, 1)
  179. td2 := clones[0].(*TreeDiff)
  180. assert.False(t, td1 == td2)
  181. assert.Equal(t, td1.SkipDirs, td2.SkipDirs)
  182. assert.Equal(t, td1.previousTree, td2.previousTree)
  183. td1.Merge([]core.PipelineItem{td2})
  184. }