ticks_test.go 7.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230
  1. package plumbing
  2. import (
  3. "bytes"
  4. "strings"
  5. "testing"
  6. "time"
  7. "github.com/stretchr/testify/assert"
  8. "gopkg.in/src-d/go-git.v4/plumbing"
  9. "gopkg.in/src-d/hercules.v10/internal/core"
  10. "gopkg.in/src-d/hercules.v10/internal/test"
  11. )
  12. func fixtureTicksSinceStart(config ...map[string]interface{}) *TicksSinceStart {
  13. tss := TicksSinceStart{
  14. TickSize: 24 * time.Hour,
  15. }
  16. if len(config) != 1 {
  17. config = []map[string]interface{}{{}}
  18. }
  19. tss.Configure(config[0])
  20. tss.Initialize(test.Repository)
  21. return &tss
  22. }
  23. func TestTicksSinceStartMeta(t *testing.T) {
  24. tss := fixtureTicksSinceStart()
  25. assert.Equal(t, tss.Name(), "TicksSinceStart")
  26. assert.Equal(t, len(tss.Provides()), 1)
  27. assert.Equal(t, tss.Provides()[0], DependencyTick)
  28. assert.Equal(t, len(tss.Requires()), 0)
  29. assert.Len(t, tss.ListConfigurationOptions(), 1)
  30. logger := core.NewLogger()
  31. assert.NoError(t, tss.Configure(map[string]interface{}{
  32. core.ConfigLogger: logger,
  33. }))
  34. assert.Equal(t, logger, tss.l)
  35. }
  36. func TestTicksSinceStartRegistration(t *testing.T) {
  37. summoned := core.Registry.Summon((&TicksSinceStart{}).Name())
  38. assert.Len(t, summoned, 1)
  39. assert.Equal(t, summoned[0].Name(), "TicksSinceStart")
  40. summoned = core.Registry.Summon((&TicksSinceStart{}).Provides()[0])
  41. assert.Len(t, summoned, 1)
  42. assert.Equal(t, summoned[0].Name(), "TicksSinceStart")
  43. }
  44. func TestTicksSinceStartConsume(t *testing.T) {
  45. tss := fixtureTicksSinceStart()
  46. tss.TickSize = time.Second
  47. deps := map[string]interface{}{}
  48. commit, _ := test.Repository.CommitObject(plumbing.NewHash(
  49. "cce947b98a050c6d356bc6ba95030254914027b1"))
  50. deps[core.DependencyCommit] = commit
  51. deps[core.DependencyIndex] = 0
  52. res, err := tss.Consume(deps)
  53. assert.Nil(t, err)
  54. assert.Equal(t, 0, res[DependencyTick].(int))
  55. assert.Equal(t, 0, tss.previousTick)
  56. assert.Equal(t, 2016, tss.tick0.Year())
  57. assert.Equal(t, time.Month(12), tss.tick0.Month())
  58. assert.Equal(t, 12, tss.tick0.Day())
  59. assert.Equal(t, 18, tss.tick0.Hour()) // 18 UTC+1
  60. assert.Equal(t, 30, tss.tick0.Minute()) // 30
  61. assert.Equal(t, 29, tss.tick0.Second()) // 29
  62. tss = fixtureTicksSinceStart()
  63. res, err = tss.Consume(deps)
  64. assert.Nil(t, err)
  65. assert.Equal(t, 0, res[DependencyTick].(int))
  66. assert.Equal(t, 0, tss.previousTick)
  67. assert.Equal(t, 2016, tss.tick0.Year())
  68. assert.Equal(t, time.Month(12), tss.tick0.Month())
  69. assert.Equal(t, 12, tss.tick0.Day())
  70. assert.Equal(t, 1, tss.tick0.Hour()) // UTC+1
  71. assert.Equal(t, 0, tss.tick0.Minute())
  72. assert.Equal(t, 0, tss.tick0.Second())
  73. commit, _ = test.Repository.CommitObject(plumbing.NewHash(
  74. "fc9ceecb6dabcb2aab60e8619d972e8d8208a7df"))
  75. deps[core.DependencyCommit] = commit
  76. deps[core.DependencyIndex] = 10
  77. res, err = tss.Consume(deps)
  78. assert.Nil(t, err)
  79. assert.Equal(t, 1, res[DependencyTick].(int))
  80. assert.Equal(t, 1, tss.previousTick)
  81. commit, _ = test.Repository.CommitObject(plumbing.NewHash(
  82. "a3ee37f91f0d705ec9c41ae88426f0ae44b2fbc3"))
  83. deps[core.DependencyCommit] = commit
  84. deps[core.DependencyIndex] = 20
  85. res, err = tss.Consume(deps)
  86. assert.Nil(t, err)
  87. assert.Equal(t, 1, res[DependencyTick].(int))
  88. assert.Equal(t, 1, tss.previousTick)
  89. commit, _ = test.Repository.CommitObject(plumbing.NewHash(
  90. "a8b665a65d7aced63f5ba2ff6d9b71dac227f8cf"))
  91. deps[core.DependencyCommit] = commit
  92. deps[core.DependencyIndex] = 20
  93. res, err = tss.Consume(deps)
  94. assert.Nil(t, err)
  95. assert.Equal(t, 2, res[DependencyTick].(int))
  96. assert.Equal(t, 2, tss.previousTick)
  97. commit, _ = test.Repository.CommitObject(plumbing.NewHash(
  98. "186ff0d7e4983637bb3762a24d6d0a658e7f4712"))
  99. deps[core.DependencyCommit] = commit
  100. deps[core.DependencyIndex] = 30
  101. res, err = tss.Consume(deps)
  102. assert.Nil(t, err)
  103. assert.Equal(t, 2, res[DependencyTick].(int))
  104. assert.Equal(t, 2, tss.previousTick)
  105. assert.Len(t, tss.commits, 3)
  106. assert.Equal(t, tss.commits[0], []plumbing.Hash{plumbing.NewHash(
  107. "cce947b98a050c6d356bc6ba95030254914027b1")})
  108. assert.Equal(t, tss.commits[1], []plumbing.Hash{
  109. plumbing.NewHash("fc9ceecb6dabcb2aab60e8619d972e8d8208a7df"),
  110. plumbing.NewHash("a3ee37f91f0d705ec9c41ae88426f0ae44b2fbc3")})
  111. assert.Equal(t, tss.commits[2], []plumbing.Hash{
  112. plumbing.NewHash("a8b665a65d7aced63f5ba2ff6d9b71dac227f8cf"),
  113. plumbing.NewHash("186ff0d7e4983637bb3762a24d6d0a658e7f4712")})
  114. }
  115. func TestTicksSinceStartConsumeWithTickSize(t *testing.T) {
  116. tss := fixtureTicksSinceStart(map[string]interface{}{
  117. ConfigTicksSinceStartTickSize: 1, // 1x hour
  118. })
  119. commit, _ := test.Repository.CommitObject(plumbing.NewHash(
  120. "cce947b98a050c6d356bc6ba95030254914027b1"))
  121. deps := map[string]interface{}{
  122. core.DependencyCommit: commit,
  123. core.DependencyIndex: 0,
  124. }
  125. res, err := tss.Consume(deps)
  126. assert.Nil(t, err)
  127. assert.Equal(t, 0, res[DependencyTick].(int))
  128. assert.Equal(t, 0, tss.previousTick)
  129. assert.Equal(t, 18, tss.tick0.Hour()) // 18 UTC+1
  130. assert.Equal(t, 0, tss.tick0.Minute()) // 30
  131. assert.Equal(t, 0, tss.tick0.Second()) // 29
  132. commit, _ = test.Repository.CommitObject(plumbing.NewHash(
  133. "fc9ceecb6dabcb2aab60e8619d972e8d8208a7df"))
  134. deps[core.DependencyCommit] = commit
  135. deps[core.DependencyIndex] = 10
  136. res, err = tss.Consume(deps)
  137. assert.Nil(t, err)
  138. assert.Equal(t, 24, res[DependencyTick].(int)) // 1 day later
  139. assert.Equal(t, 24, tss.previousTick)
  140. commit, _ = test.Repository.CommitObject(plumbing.NewHash(
  141. "a3ee37f91f0d705ec9c41ae88426f0ae44b2fbc3"))
  142. deps[core.DependencyCommit] = commit
  143. deps[core.DependencyIndex] = 20
  144. res, err = tss.Consume(deps)
  145. assert.Nil(t, err)
  146. assert.Equal(t, 24, res[DependencyTick].(int)) // 1 day later
  147. assert.Equal(t, 24, tss.previousTick)
  148. assert.Len(t, tss.commits, 2)
  149. assert.Equal(t, []plumbing.Hash{plumbing.NewHash(
  150. "cce947b98a050c6d356bc6ba95030254914027b1")},
  151. tss.commits[0])
  152. assert.Equal(t, []plumbing.Hash{
  153. plumbing.NewHash("fc9ceecb6dabcb2aab60e8619d972e8d8208a7df"),
  154. plumbing.NewHash("a3ee37f91f0d705ec9c41ae88426f0ae44b2fbc3")},
  155. tss.commits[24])
  156. }
  157. func TestTicksCommits(t *testing.T) {
  158. tss := fixtureTicksSinceStart()
  159. tss.commits[0] = []plumbing.Hash{plumbing.NewHash(
  160. "cce947b98a050c6d356bc6ba95030254914027b1")}
  161. commits := tss.commits
  162. assert.NoError(t, tss.Initialize(test.Repository))
  163. assert.Len(t, tss.commits, 0)
  164. assert.Equal(t, tss.commits, commits)
  165. }
  166. func TestTicksSinceStartFork(t *testing.T) {
  167. tss1 := fixtureTicksSinceStart()
  168. tss1.commits[0] = []plumbing.Hash{plumbing.NewHash(
  169. "cce947b98a050c6d356bc6ba95030254914027b1")}
  170. clones := tss1.Fork(1)
  171. assert.Len(t, clones, 1)
  172. tss2 := clones[0].(*TicksSinceStart)
  173. assert.Equal(t, tss1.tick0, tss2.tick0)
  174. assert.Equal(t, tss1.previousTick, tss2.previousTick)
  175. assert.Equal(t, tss1.commits, tss2.commits)
  176. tss1.commits[0] = append(tss1.commits[0], plumbing.ZeroHash)
  177. assert.Len(t, tss2.commits[0], 2)
  178. assert.True(t, tss1 != tss2)
  179. // just for the sake of it
  180. tss1.Merge([]core.PipelineItem{tss2})
  181. }
  182. func TestTicksSinceStartConsumeZero(t *testing.T) {
  183. tss := fixtureTicksSinceStart()
  184. deps := map[string]interface{}{}
  185. commit, _ := test.Repository.CommitObject(plumbing.NewHash(
  186. "cce947b98a050c6d356bc6ba95030254914027b1"))
  187. commit.Committer.When = time.Unix(0, 0)
  188. deps[core.DependencyCommit] = commit
  189. deps[core.DependencyIndex] = 0
  190. // print warning to log
  191. var capture bytes.Buffer
  192. tss.l.(*core.DefaultLogger).W.SetOutput(&capture)
  193. res, err := tss.Consume(deps)
  194. assert.Nil(t, err)
  195. output := capture.String()
  196. assert.Contains(t, output, "cce947b98a050c6d356bc6ba95030254914027b1")
  197. assert.Contains(t, output, "hercules")
  198. // depending on where the contributor clones this project from, the remote
  199. // reported in the error could either be from gopkg.in or github.com
  200. if !strings.Contains(output, "github.com") && !strings.Contains(output, "gopkg.in") {
  201. assert.Failf(t, "output should contain either 'github.com' or 'gopkg.in'", "got: '%s'", output)
  202. }
  203. assert.Equal(t, res[DependencyTick].(int), 0)
  204. assert.Equal(t, tss.previousTick, 0)
  205. if (tss.tick0.Year() != 1969) && (tss.tick0.Year() != 1970) {
  206. assert.Failf(t, "tick0 should be unix-0 time (in either 1969 or 1970)", "got: '%v'", tss.tick0)
  207. }
  208. assert.Equal(t, tss.tick0.Minute(), 0)
  209. assert.Equal(t, tss.tick0.Second(), 0)
  210. }