ticks_test.go 7.3 KB

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