manager_test.go 5.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246
  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. lowerSo bool
  25. err error
  26. }{
  27. {
  28. t: SOURCE,
  29. n: "",
  30. u: "",
  31. err: errors.New("invalid name : should not be empty"),
  32. }, {
  33. t: SOURCE,
  34. n: "zipMissConf",
  35. u: endpoint + "/sources/zipMissConf.zip",
  36. err: errors.New("fail to unzip file " + endpoint + "/sources/zipMissConf.zip: invalid zip file: so file or conf file is missing"),
  37. }, {
  38. t: SINK,
  39. n: "urlerror",
  40. u: endpoint + "/sinks/nozip",
  41. err: errors.New("invalid uri " + endpoint + "/sinks/nozip"),
  42. }, {
  43. t: SINK,
  44. n: "zipWrongname",
  45. u: endpoint + "/sinks/zipWrongName.zip",
  46. err: errors.New("fail to unzip file " + endpoint + "/sinks/zipWrongName.zip: invalid zip file: so file or conf file is missing"),
  47. }, {
  48. t: FUNCTION,
  49. n: "zipMissSo",
  50. u: endpoint + "/functions/zipMissSo.zip",
  51. err: errors.New("fail to unzip file " + endpoint + "/functions/zipMissSo.zip: invalid zip file: so file or conf file is missing"),
  52. }, {
  53. t: SOURCE,
  54. n: "random2",
  55. u: endpoint + "/sources/random2.zip",
  56. }, {
  57. t: SOURCE,
  58. n: "random3",
  59. u: endpoint + "/sources/random3.zip",
  60. v: "1.0.0",
  61. }, {
  62. t: SINK,
  63. n: "file2",
  64. u: endpoint + "/sinks/file2.zip",
  65. lowerSo: true,
  66. }, {
  67. t: FUNCTION,
  68. n: "echo2",
  69. u: endpoint + "/functions/echo2.zip",
  70. }, {
  71. t: FUNCTION,
  72. n: "echo2",
  73. u: endpoint + "/functions/echo2.zip",
  74. err: errors.New("invalid name echo2: duplicate"),
  75. },
  76. }
  77. manager, err := NewPluginManager()
  78. if err != nil {
  79. t.Error(err)
  80. }
  81. fmt.Printf("The test bucket size is %d.\n\n", len(data))
  82. for i, tt := range data {
  83. err = manager.Register(tt.t, &Plugin{
  84. Name: tt.n,
  85. File: tt.u,
  86. })
  87. if !reflect.DeepEqual(tt.err, err) {
  88. t.Errorf("%d: error mismatch:\n exp=%s\n got=%s\n\n", i, tt.err, err)
  89. } else if tt.err == nil {
  90. err := checkFile(manager.pluginDir, manager.etcDir, tt.t, tt.n, tt.v, tt.lowerSo)
  91. if err != nil {
  92. t.Errorf("%d: error : %s\n\n", i, err)
  93. }
  94. }
  95. }
  96. }
  97. func TestManager_List(t *testing.T) {
  98. data := []struct {
  99. t PluginType
  100. r []string
  101. }{
  102. {
  103. t: SOURCE,
  104. r: []string{"random", "random2", "random3"},
  105. }, {
  106. t: SINK,
  107. r: []string{"file", "file2"},
  108. }, {
  109. t: FUNCTION,
  110. r: []string{"accumulateWordCount", "countPlusOne", "echo", "echo2"},
  111. },
  112. }
  113. manager, err := NewPluginManager()
  114. if err != nil {
  115. t.Error(err)
  116. }
  117. fmt.Printf("The test bucket size is %d.\n\n", len(data))
  118. for i, p := range data {
  119. result, err := manager.List(p.t)
  120. if err != nil {
  121. t.Errorf("%d: list error : %s\n\n", i, err)
  122. return
  123. }
  124. sort.Strings(result)
  125. if !reflect.DeepEqual(p.r, result) {
  126. t.Errorf("%d: result mismatch:\n exp=%v\n got=%v\n\n", i, p.r, result)
  127. }
  128. }
  129. }
  130. func TestManager_Desc(t *testing.T) {
  131. data := []struct {
  132. t PluginType
  133. n string
  134. r map[string]string
  135. }{
  136. {
  137. t: SOURCE,
  138. n: "random2",
  139. r: map[string]string{
  140. "name": "random2",
  141. "version": "",
  142. },
  143. }, {
  144. t: SOURCE,
  145. n: "random3",
  146. r: map[string]string{
  147. "name": "random3",
  148. "version": "1.0.0",
  149. },
  150. }, {
  151. t: FUNCTION,
  152. n: "echo2",
  153. r: map[string]string{
  154. "name": "echo2",
  155. "version": "",
  156. },
  157. },
  158. }
  159. manager, err := NewPluginManager()
  160. if err != nil {
  161. t.Error(err)
  162. }
  163. fmt.Printf("The test bucket size is %d.\n\n", len(data))
  164. for i, p := range data {
  165. result, ok := manager.Get(p.t, p.n)
  166. if !ok {
  167. t.Errorf("%d: get error : not found\n\n", i)
  168. return
  169. }
  170. if !reflect.DeepEqual(p.r, result) {
  171. t.Errorf("%d: result mismatch:\n exp=%v\n got=%v\n\n", i, p.r, result)
  172. }
  173. }
  174. }
  175. func TestManager_Delete(t *testing.T) {
  176. data := []struct {
  177. t PluginType
  178. n string
  179. err error
  180. }{
  181. {
  182. t: SOURCE,
  183. n: "random2",
  184. }, {
  185. t: SINK,
  186. n: "file2",
  187. }, {
  188. t: FUNCTION,
  189. n: "echo2",
  190. }, {
  191. t: SOURCE,
  192. n: "random3",
  193. },
  194. }
  195. manager, err := NewPluginManager()
  196. if err != nil {
  197. t.Error(err)
  198. }
  199. fmt.Printf("The test bucket size is %d.\n\n", len(data))
  200. for i, p := range data {
  201. err = manager.Delete(p.t, p.n, false)
  202. if err != nil {
  203. t.Errorf("%d: delete error : %s\n\n", i, err)
  204. }
  205. }
  206. }
  207. func checkFile(pluginDir string, etcDir string, t PluginType, name string, version string, lowerSo bool) error {
  208. var soName string
  209. if !lowerSo {
  210. soName = ucFirst(name) + ".so"
  211. if version != "" {
  212. soName = fmt.Sprintf("%s@v%s.so", ucFirst(name), version)
  213. }
  214. } else {
  215. soName = name + ".so"
  216. if version != "" {
  217. soName = fmt.Sprintf("%s@v%s.so", name, version)
  218. }
  219. }
  220. soPath := path.Join(pluginDir, PluginTypes[t], soName)
  221. _, err := os.Stat(soPath)
  222. if err != nil {
  223. return err
  224. }
  225. if t == SOURCE {
  226. etcPath := path.Join(etcDir, PluginTypes[t], name+".yaml")
  227. _, err = os.Stat(etcPath)
  228. if err != nil {
  229. return err
  230. }
  231. }
  232. return nil
  233. }