file_history_test.go 5.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182
  1. package leaves
  2. import (
  3. "bytes"
  4. "testing"
  5. "github.com/gogo/protobuf/proto"
  6. "github.com/stretchr/testify/assert"
  7. "gopkg.in/src-d/go-git.v4/plumbing"
  8. "gopkg.in/src-d/go-git.v4/plumbing/object"
  9. "gopkg.in/src-d/hercules.v7/internal/core"
  10. "gopkg.in/src-d/hercules.v7/internal/pb"
  11. items "gopkg.in/src-d/hercules.v7/internal/plumbing"
  12. "gopkg.in/src-d/hercules.v7/internal/test"
  13. )
  14. func fixtureFileHistory() *FileHistory {
  15. fh := FileHistory{}
  16. fh.Initialize(test.Repository)
  17. return &fh
  18. }
  19. func TestFileHistoryMeta(t *testing.T) {
  20. fh := fixtureFileHistory()
  21. assert.Equal(t, fh.Name(), "FileHistory")
  22. assert.Equal(t, len(fh.Provides()), 0)
  23. assert.Equal(t, len(fh.Requires()), 1)
  24. assert.Equal(t, fh.Requires()[0], items.DependencyTreeChanges)
  25. assert.Len(t, fh.ListConfigurationOptions(), 0)
  26. fh.Configure(nil)
  27. }
  28. func TestFileHistoryRegistration(t *testing.T) {
  29. summoned := core.Registry.Summon((&FileHistory{}).Name())
  30. assert.Len(t, summoned, 1)
  31. assert.Equal(t, summoned[0].Name(), "FileHistory")
  32. leaves := core.Registry.GetLeaves()
  33. matched := false
  34. for _, tp := range leaves {
  35. if tp.Flag() == (&FileHistory{}).Flag() {
  36. matched = true
  37. break
  38. }
  39. }
  40. assert.True(t, matched)
  41. }
  42. func TestFileHistoryConsume(t *testing.T) {
  43. fh := fixtureFileHistory()
  44. deps := map[string]interface{}{}
  45. changes := make(object.Changes, 3)
  46. treeFrom, _ := test.Repository.TreeObject(plumbing.NewHash(
  47. "a1eb2ea76eb7f9bfbde9b243861474421000eb96"))
  48. treeTo, _ := test.Repository.TreeObject(plumbing.NewHash(
  49. "994eac1cd07235bb9815e547a75c84265dea00f5"))
  50. changes[0] = &object.Change{From: object.ChangeEntry{
  51. Name: "analyser.go",
  52. Tree: treeFrom,
  53. TreeEntry: object.TreeEntry{
  54. Name: "analyser.go",
  55. Mode: 0100644,
  56. Hash: plumbing.NewHash("dc248ba2b22048cc730c571a748e8ffcf7085ab9"),
  57. },
  58. }, To: object.ChangeEntry{
  59. Name: "analyser.go",
  60. Tree: treeTo,
  61. TreeEntry: object.TreeEntry{
  62. Name: "analyser.go",
  63. Mode: 0100644,
  64. Hash: plumbing.NewHash("baa64828831d174f40140e4b3cfa77d1e917a2c1"),
  65. },
  66. }}
  67. changes[1] = &object.Change{To: object.ChangeEntry{}, From: object.ChangeEntry{
  68. Name: "cmd/hercules/main.go",
  69. Tree: treeTo,
  70. TreeEntry: object.TreeEntry{
  71. Name: "cmd/hercules/main.go",
  72. Mode: 0100644,
  73. Hash: plumbing.NewHash("c29112dbd697ad9b401333b80c18a63951bc18d9"),
  74. },
  75. },
  76. }
  77. changes[2] = &object.Change{From: object.ChangeEntry{}, To: object.ChangeEntry{
  78. Name: ".travis.yml",
  79. Tree: treeTo,
  80. TreeEntry: object.TreeEntry{
  81. Name: ".travis.yml",
  82. Mode: 0100644,
  83. Hash: plumbing.NewHash("291286b4ac41952cbd1389fda66420ec03c1a9fe"),
  84. },
  85. },
  86. }
  87. deps[items.DependencyTreeChanges] = changes
  88. commit, _ := test.Repository.CommitObject(plumbing.NewHash(
  89. "2b1ed978194a94edeabbca6de7ff3b5771d4d665"))
  90. deps[core.DependencyCommit] = commit
  91. fh.files["cmd/hercules/main.go"] = []plumbing.Hash{plumbing.NewHash(
  92. "0000000000000000000000000000000000000000")}
  93. fh.files["analyser.go"] = []plumbing.Hash{plumbing.NewHash(
  94. "ffffffffffffffffffffffffffffffffffffffff")}
  95. fh.Consume(deps)
  96. assert.Len(t, fh.files, 2)
  97. assert.Nil(t, fh.files["cmd/hercules/main.go"])
  98. assert.Len(t, fh.files["analyser.go"], 2)
  99. assert.Equal(t, fh.files["analyser.go"][0], plumbing.NewHash(
  100. "ffffffffffffffffffffffffffffffffffffffff"))
  101. assert.Equal(t, fh.files["analyser.go"][1], plumbing.NewHash(
  102. "2b1ed978194a94edeabbca6de7ff3b5771d4d665"))
  103. assert.Len(t, fh.files[".travis.yml"], 1)
  104. assert.Equal(t, fh.files[".travis.yml"][0], plumbing.NewHash(
  105. "2b1ed978194a94edeabbca6de7ff3b5771d4d665"))
  106. res := fh.Finalize().(FileHistoryResult)
  107. assert.Equal(t, fh.files, res.Files)
  108. }
  109. func TestFileHistoryFork(t *testing.T) {
  110. fh1 := fixtureFileHistory()
  111. clones := fh1.Fork(1)
  112. assert.Len(t, clones, 1)
  113. fh2 := clones[0].(*FileHistory)
  114. assert.True(t, fh1 == fh2)
  115. fh1.Merge([]core.PipelineItem{fh2})
  116. }
  117. func TestFileHistorySerializeText(t *testing.T) {
  118. fh := fixtureFileHistory()
  119. deps := map[string]interface{}{}
  120. changes := make(object.Changes, 1)
  121. treeTo, _ := test.Repository.TreeObject(plumbing.NewHash(
  122. "994eac1cd07235bb9815e547a75c84265dea00f5"))
  123. changes[0] = &object.Change{From: object.ChangeEntry{}, To: object.ChangeEntry{
  124. Name: ".travis.yml",
  125. Tree: treeTo,
  126. TreeEntry: object.TreeEntry{
  127. Name: ".travis.yml",
  128. Mode: 0100644,
  129. Hash: plumbing.NewHash("291286b4ac41952cbd1389fda66420ec03c1a9fe"),
  130. },
  131. },
  132. }
  133. deps[items.DependencyTreeChanges] = changes
  134. commit, _ := test.Repository.CommitObject(plumbing.NewHash(
  135. "2b1ed978194a94edeabbca6de7ff3b5771d4d665"))
  136. deps[core.DependencyCommit] = commit
  137. fh.Consume(deps)
  138. res := fh.Finalize().(FileHistoryResult)
  139. buffer := &bytes.Buffer{}
  140. fh.Serialize(res, false, buffer)
  141. assert.Equal(t, buffer.String(), " - .travis.yml: [\"2b1ed978194a94edeabbca6de7ff3b5771d4d665\"]\n")
  142. }
  143. func TestFileHistorySerializeBinary(t *testing.T) {
  144. fh := fixtureFileHistory()
  145. deps := map[string]interface{}{}
  146. changes := make(object.Changes, 1)
  147. treeTo, _ := test.Repository.TreeObject(plumbing.NewHash(
  148. "994eac1cd07235bb9815e547a75c84265dea00f5"))
  149. changes[0] = &object.Change{From: object.ChangeEntry{}, To: object.ChangeEntry{
  150. Name: ".travis.yml",
  151. Tree: treeTo,
  152. TreeEntry: object.TreeEntry{
  153. Name: ".travis.yml",
  154. Mode: 0100644,
  155. Hash: plumbing.NewHash("291286b4ac41952cbd1389fda66420ec03c1a9fe"),
  156. },
  157. },
  158. }
  159. deps[items.DependencyTreeChanges] = changes
  160. commit, _ := test.Repository.CommitObject(plumbing.NewHash(
  161. "2b1ed978194a94edeabbca6de7ff3b5771d4d665"))
  162. deps[core.DependencyCommit] = commit
  163. fh.Consume(deps)
  164. res := fh.Finalize().(FileHistoryResult)
  165. buffer := &bytes.Buffer{}
  166. fh.Serialize(res, true, buffer)
  167. msg := pb.FileHistoryResultMessage{}
  168. proto.Unmarshal(buffer.Bytes(), &msg)
  169. assert.Len(t, msg.Files, 1)
  170. assert.Len(t, msg.Files[".travis.yml"].Commits, 1)
  171. assert.Equal(t, msg.Files[".travis.yml"].Commits[0], "2b1ed978194a94edeabbca6de7ff3b5771d4d665")
  172. }