manager_test.go 3.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187
  1. package plugins
  2. import (
  3. "errors"
  4. "fmt"
  5. "net/http"
  6. "net/http/httptest"
  7. "os"
  8. "path"
  9. "reflect"
  10. "sort"
  11. "testing"
  12. )
  13. func TestManager_Register(t *testing.T) {
  14. s := httptest.NewServer(
  15. http.FileServer(http.Dir("testzips")),
  16. )
  17. defer s.Close()
  18. endpoint := s.URL
  19. data := []struct {
  20. t PluginType
  21. n string
  22. u string
  23. v string
  24. err error
  25. }{
  26. {
  27. t: SOURCE,
  28. n: "",
  29. u: "",
  30. err: errors.New("invalid name : should not be empty"),
  31. }, {
  32. t: SOURCE,
  33. n: "zipMissConf",
  34. u: endpoint + "/sources/zipMissConf.zip",
  35. err: errors.New("fail to unzip file " + endpoint + "/sources/zipMissConf.zip: invalid zip file: so file or conf file is missing"),
  36. }, {
  37. t: SINK,
  38. n: "urlerror",
  39. u: endpoint + "/sinks/nozip",
  40. err: errors.New("invalid uri " + endpoint + "/sinks/nozip"),
  41. }, {
  42. t: SINK,
  43. n: "zipWrongname",
  44. u: endpoint + "/sinks/zipWrongName.zip",
  45. err: errors.New("fail to unzip file " + endpoint + "/sinks/zipWrongName.zip: invalid zip file: so file or conf file is missing"),
  46. }, {
  47. t: FUNCTION,
  48. n: "zipMissSo",
  49. u: endpoint + "/functions/zipMissSo.zip",
  50. err: errors.New("fail to unzip file " + endpoint + "/functions/zipMissSo.zip: invalid zip file: so file or conf file is missing"),
  51. }, {
  52. t: SOURCE,
  53. n: "random2",
  54. u: endpoint + "/sources/random2.zip",
  55. }, {
  56. t: SOURCE,
  57. n: "random3",
  58. u: endpoint + "/sources/random3.zip",
  59. v: "1.0.0",
  60. }, {
  61. t: SINK,
  62. n: "file2",
  63. u: endpoint + "/sinks/file2.zip",
  64. }, {
  65. t: FUNCTION,
  66. n: "echo2",
  67. u: endpoint + "/functions/echo2.zip",
  68. }, {
  69. t: FUNCTION,
  70. n: "echo2",
  71. u: endpoint + "/functions/echo2.zip",
  72. err: errors.New("invalid name echo2: duplicate"),
  73. },
  74. }
  75. manager, err := NewPluginManager()
  76. if err != nil {
  77. t.Error(err)
  78. }
  79. fmt.Printf("The test bucket size is %d.\n\n", len(data))
  80. for i, tt := range data {
  81. err = manager.Register(tt.t, &Plugin{
  82. Name: tt.n,
  83. File: tt.u,
  84. })
  85. if !reflect.DeepEqual(tt.err, err) {
  86. t.Errorf("%d: error mismatch:\n exp=%s\n got=%s\n\n", i, tt.err, err)
  87. } else if tt.err == nil {
  88. err := checkFile(manager.pluginDir, manager.etcDir, tt.t, tt.n, tt.v)
  89. if err != nil {
  90. t.Errorf("%d: error : %s\n\n", i, err)
  91. }
  92. }
  93. }
  94. }
  95. func TestManager_List(t *testing.T) {
  96. data := []struct {
  97. t PluginType
  98. r []string
  99. }{
  100. {
  101. t: SOURCE,
  102. r: []string{"random2", "random3"},
  103. }, {
  104. t: SINK,
  105. r: []string{"file2"},
  106. }, {
  107. t: FUNCTION,
  108. r: []string{"echo2"},
  109. },
  110. }
  111. manager, err := NewPluginManager()
  112. if err != nil {
  113. t.Error(err)
  114. }
  115. fmt.Printf("The test bucket size is %d.\n\n", len(data))
  116. for i, p := range data {
  117. result, err := manager.List(p.t)
  118. if err != nil {
  119. t.Errorf("%d: list error : %s\n\n", i, err)
  120. }
  121. sort.Strings(result)
  122. if !reflect.DeepEqual(p.r, result) {
  123. t.Errorf("%d: result mismatch:\n exp=%v\n got=%v\n\n", i, p.r, result)
  124. }
  125. }
  126. }
  127. func TestManager_Delete(t *testing.T) {
  128. data := []struct {
  129. t PluginType
  130. n string
  131. err error
  132. }{
  133. {
  134. t: SOURCE,
  135. n: "random2",
  136. }, {
  137. t: SINK,
  138. n: "file2",
  139. }, {
  140. t: FUNCTION,
  141. n: "echo2",
  142. }, {
  143. t: SOURCE,
  144. n: "random3",
  145. },
  146. }
  147. manager, err := NewPluginManager()
  148. if err != nil {
  149. t.Error(err)
  150. }
  151. fmt.Printf("The test bucket size is %d.\n\n", len(data))
  152. for i, p := range data {
  153. err = manager.Delete(p.t, p.n, false)
  154. if err != nil {
  155. t.Errorf("%d: delete error : %s\n\n", i, err)
  156. }
  157. }
  158. }
  159. func checkFile(pluginDir string, etcDir string, t PluginType, name string, version string) error {
  160. soName := ucFirst(name) + ".so"
  161. if version != "" {
  162. soName = fmt.Sprintf("%s@v%s.so", ucFirst(name), version)
  163. }
  164. soPath := path.Join(pluginDir, PluginTypes[t], soName)
  165. _, err := os.Stat(soPath)
  166. if err != nil {
  167. return err
  168. }
  169. if t == SOURCE {
  170. etcPath := path.Join(etcDir, PluginTypes[t], name+".yaml")
  171. _, err = os.Stat(etcPath)
  172. if err != nil {
  173. return err
  174. }
  175. }
  176. return nil
  177. }