tree_diff_test.go 4.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144
  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, 2)
  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["commit"] = 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["commit"] = 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["commit"] = 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. commit, _ := test.Repository.CommitObject(plumbing.NewHash(
  110. "aefdedf7cafa6ee110bae9a3910bf5088fdeb5a9"))
  111. deps := map[string]interface{}{}
  112. deps["commit"] = commit
  113. prevCommit, _ := test.Repository.CommitObject(plumbing.NewHash(
  114. "1e076dc56989bc6aa1ef5f55901696e9e01423d4"))
  115. td.previousTree, _ = prevCommit.Tree()
  116. res, err := td.Consume(deps)
  117. assert.Nil(t, err)
  118. assert.Equal(t, len(res), 1)
  119. changes := res[DependencyTreeChanges].(object.Changes)
  120. assert.Equal(t, 37, len(changes))
  121. // consume with skipping
  122. td = fixtureTreeDiff()
  123. td.previousTree, _ = prevCommit.Tree()
  124. td.Configure(map[string]interface{}{
  125. ConfigTreeDiffEnableBlacklist: true,
  126. ConfigTreeDiffBlacklistedDirs: []string{"vendor/"},
  127. })
  128. res, err = td.Consume(deps)
  129. assert.Nil(t, err)
  130. assert.Equal(t, len(res), 1)
  131. changes = res[DependencyTreeChanges].(object.Changes)
  132. assert.Equal(t, 31, len(changes))
  133. }