registry_test.go 6.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218
  1. package core
  2. import (
  3. "reflect"
  4. "testing"
  5. "github.com/spf13/cobra"
  6. "github.com/stretchr/testify/assert"
  7. "gopkg.in/src-d/go-git.v4"
  8. "gopkg.in/src-d/hercules.v6/internal/test"
  9. )
  10. func getRegistry() *PipelineItemRegistry {
  11. return &PipelineItemRegistry{
  12. provided: map[string][]reflect.Type{},
  13. registered: map[string]reflect.Type{},
  14. flags: map[string]reflect.Type{},
  15. featureFlags: arrayFeatureFlags{Flags: []string{}, Choices: map[string]bool{}},
  16. }
  17. }
  18. type dummyPipelineItem struct{}
  19. func (item *dummyPipelineItem) Name() string {
  20. return "dummy"
  21. }
  22. func (item *dummyPipelineItem) Provides() []string {
  23. arr := [...]string{"dummy"}
  24. return arr[:]
  25. }
  26. func (item *dummyPipelineItem) Requires() []string {
  27. return []string{}
  28. }
  29. func (item *dummyPipelineItem) Features() []string {
  30. arr := [...]string{"power"}
  31. return arr[:]
  32. }
  33. func (item *dummyPipelineItem) Configure(facts map[string]interface{}) error {
  34. return nil
  35. }
  36. func (item *dummyPipelineItem) ListConfigurationOptions() []ConfigurationOption {
  37. options := [...]ConfigurationOption{{
  38. Name: "DummyOption",
  39. Description: "The option description.",
  40. Flag: "dummy-option",
  41. Type: BoolConfigurationOption,
  42. Default: false,
  43. }}
  44. return options[:]
  45. }
  46. func (item *dummyPipelineItem) Initialize(repository *git.Repository) error {
  47. return nil
  48. }
  49. func (item *dummyPipelineItem) Consume(deps map[string]interface{}) (map[string]interface{}, error) {
  50. return map[string]interface{}{"dummy": nil}, nil
  51. }
  52. func (item *dummyPipelineItem) Fork(n int) []PipelineItem {
  53. return nil
  54. }
  55. func (item *dummyPipelineItem) Merge(branches []PipelineItem) {
  56. }
  57. type dummyPipelineItem2 struct{}
  58. func (item *dummyPipelineItem2) Name() string {
  59. return "dummy2"
  60. }
  61. func (item *dummyPipelineItem2) Provides() []string {
  62. arr := [...]string{"dummy2"}
  63. return arr[:]
  64. }
  65. func (item *dummyPipelineItem2) Requires() []string {
  66. return []string{}
  67. }
  68. func (item *dummyPipelineItem2) Features() []string {
  69. arr := [...]string{"other"}
  70. return arr[:]
  71. }
  72. func (item *dummyPipelineItem2) Configure(facts map[string]interface{}) error {
  73. return nil
  74. }
  75. func (item *dummyPipelineItem2) ListConfigurationOptions() []ConfigurationOption {
  76. return []ConfigurationOption{}
  77. }
  78. func (item *dummyPipelineItem2) Initialize(repository *git.Repository) error {
  79. return nil
  80. }
  81. func (item *dummyPipelineItem2) Consume(deps map[string]interface{}) (map[string]interface{}, error) {
  82. return map[string]interface{}{"dummy2": nil}, nil
  83. }
  84. func (item *dummyPipelineItem2) Fork(n int) []PipelineItem {
  85. return nil
  86. }
  87. func (item *dummyPipelineItem2) Merge(branches []PipelineItem) {
  88. }
  89. func TestRegistrySummon(t *testing.T) {
  90. reg := getRegistry()
  91. reg.Register(&testPipelineItem{})
  92. summoned := reg.Summon((&testPipelineItem{}).Provides()[0])
  93. assert.Len(t, summoned, 1)
  94. assert.Equal(t, summoned[0].Name(), (&testPipelineItem{}).Name())
  95. summoned = reg.Summon((&testPipelineItem{}).Name())
  96. assert.Len(t, summoned, 1)
  97. assert.Equal(t, summoned[0].Name(), (&testPipelineItem{}).Name())
  98. }
  99. func TestRegistryAddFlags(t *testing.T) {
  100. reg := getRegistry()
  101. reg.Register(&testPipelineItem{})
  102. reg.Register(&dummyPipelineItem{})
  103. testCmd := &cobra.Command{
  104. Use: "test",
  105. Short: "Temporary command to test the stuff.",
  106. Long: ``,
  107. Args: cobra.MaximumNArgs(0),
  108. Run: func(cmd *cobra.Command, args []string) {},
  109. }
  110. facts, deployed := reg.AddFlags(testCmd.Flags())
  111. assert.Len(t, facts, 6)
  112. assert.IsType(t, 0, facts[(&testPipelineItem{}).ListConfigurationOptions()[0].Name])
  113. assert.IsType(t, true, facts[(&dummyPipelineItem{}).ListConfigurationOptions()[0].Name])
  114. assert.Contains(t, facts, ConfigPipelineDryRun)
  115. assert.Contains(t, facts, ConfigPipelineDAGPath)
  116. assert.Contains(t, facts, ConfigPipelineDumpPlan)
  117. assert.Contains(t, facts, ConfigPipelineHibernationDistance)
  118. assert.Len(t, deployed, 1)
  119. assert.Contains(t, deployed, (&testPipelineItem{}).Name())
  120. assert.NotNil(t, testCmd.Flags().Lookup((&testPipelineItem{}).Flag()))
  121. assert.NotNil(t, testCmd.Flags().Lookup("feature"))
  122. assert.NotNil(t, testCmd.Flags().Lookup("dump-dag"))
  123. assert.NotNil(t, testCmd.Flags().Lookup("dump-plan"))
  124. assert.NotNil(t, testCmd.Flags().Lookup("dry-run"))
  125. assert.NotNil(t, testCmd.Flags().Lookup("hibernation-distance"))
  126. assert.NotNil(t, testCmd.Flags().Lookup(
  127. (&testPipelineItem{}).ListConfigurationOptions()[0].Flag))
  128. assert.NotNil(t, testCmd.Flags().Lookup(
  129. (&dummyPipelineItem{}).ListConfigurationOptions()[0].Flag))
  130. testCmd.UsageString() // to test that nothing is broken
  131. }
  132. func TestRegistryFeatures(t *testing.T) {
  133. reg := getRegistry()
  134. reg.Register(&dummyPipelineItem{})
  135. reg.Register(&dummyPipelineItem2{})
  136. testCmd := &cobra.Command{
  137. Use: "test",
  138. Short: "Temporary command to test the stuff.",
  139. Long: ``,
  140. Args: cobra.MaximumNArgs(0),
  141. Run: func(cmd *cobra.Command, args []string) {},
  142. }
  143. reg.AddFlags(testCmd.Flags())
  144. args := [...]string{"--feature", "other", "--feature", "power"}
  145. testCmd.ParseFlags(args[:])
  146. pipeline := NewPipeline(test.Repository)
  147. val, _ := pipeline.GetFeature("power")
  148. assert.False(t, val)
  149. val, _ = pipeline.GetFeature("other")
  150. assert.False(t, val)
  151. pipeline.SetFeaturesFromFlags(reg)
  152. val, _ = pipeline.GetFeature("power")
  153. assert.True(t, val)
  154. val, _ = pipeline.GetFeature("other")
  155. assert.True(t, val)
  156. }
  157. func TestRegistryLeaves(t *testing.T) {
  158. reg := getRegistry()
  159. reg.Register(&testPipelineItem{})
  160. reg.Register(&dependingTestPipelineItem{})
  161. reg.Register(&dummyPipelineItem{})
  162. leaves := reg.GetLeaves()
  163. assert.Len(t, leaves, 2)
  164. assert.Equal(t, leaves[0].Name(), (&dependingTestPipelineItem{}).Name())
  165. assert.Equal(t, leaves[1].Name(), (&testPipelineItem{}).Name())
  166. }
  167. func TestRegistryPlumbingItems(t *testing.T) {
  168. reg := getRegistry()
  169. reg.Register(&testPipelineItem{})
  170. reg.Register(&dependingTestPipelineItem{})
  171. reg.Register(&dummyPipelineItem{})
  172. plumbing := reg.GetPlumbingItems()
  173. assert.Len(t, plumbing, 1)
  174. assert.Equal(t, plumbing[0].Name(), (&dummyPipelineItem{}).Name())
  175. }
  176. func TestRegistryFeaturedItems(t *testing.T) {
  177. reg := getRegistry()
  178. reg.Register(&testPipelineItem{})
  179. reg.Register(&dependingTestPipelineItem{})
  180. reg.Register(&dummyPipelineItem{})
  181. featured := reg.GetFeaturedItems()
  182. assert.Len(t, featured, 1)
  183. assert.Len(t, featured["power"], 2)
  184. assert.Equal(t, featured["power"][0].Name(), (&testPipelineItem{}).Name())
  185. assert.Equal(t, featured["power"][1].Name(), (&dummyPipelineItem{}).Name())
  186. }