manager_test.go 4.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235
  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{"random", "random2", "random3"},
  103. }, {
  104. t: SINK,
  105. r: []string{"file", "file2"},
  106. }, {
  107. t: FUNCTION,
  108. r: []string{"accumulateWordCount", "countPlusOne", "echo", "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. return
  121. }
  122. sort.Strings(result)
  123. if !reflect.DeepEqual(p.r, result) {
  124. t.Errorf("%d: result mismatch:\n exp=%v\n got=%v\n\n", i, p.r, result)
  125. }
  126. }
  127. }
  128. func TestManager_Desc(t *testing.T) {
  129. data := []struct {
  130. t PluginType
  131. n string
  132. r map[string]string
  133. }{
  134. {
  135. t: SOURCE,
  136. n: "random2",
  137. r: map[string]string{
  138. "name": "random2",
  139. "version": "",
  140. },
  141. }, {
  142. t: SOURCE,
  143. n: "random3",
  144. r: map[string]string{
  145. "name": "random3",
  146. "version": "1.0.0",
  147. },
  148. }, {
  149. t: FUNCTION,
  150. n: "echo2",
  151. r: map[string]string{
  152. "name": "echo2",
  153. "version": "",
  154. },
  155. },
  156. }
  157. manager, err := NewPluginManager()
  158. if err != nil {
  159. t.Error(err)
  160. }
  161. fmt.Printf("The test bucket size is %d.\n\n", len(data))
  162. for i, p := range data {
  163. result, ok := manager.Get(p.t, p.n)
  164. if !ok {
  165. t.Errorf("%d: get error : not found\n\n", i)
  166. return
  167. }
  168. if !reflect.DeepEqual(p.r, result) {
  169. t.Errorf("%d: result mismatch:\n exp=%v\n got=%v\n\n", i, p.r, result)
  170. }
  171. }
  172. }
  173. func TestManager_Delete(t *testing.T) {
  174. data := []struct {
  175. t PluginType
  176. n string
  177. err error
  178. }{
  179. {
  180. t: SOURCE,
  181. n: "random2",
  182. }, {
  183. t: SINK,
  184. n: "file2",
  185. }, {
  186. t: FUNCTION,
  187. n: "echo2",
  188. }, {
  189. t: SOURCE,
  190. n: "random3",
  191. },
  192. }
  193. manager, err := NewPluginManager()
  194. if err != nil {
  195. t.Error(err)
  196. }
  197. fmt.Printf("The test bucket size is %d.\n\n", len(data))
  198. for i, p := range data {
  199. err = manager.Delete(p.t, p.n, false)
  200. if err != nil {
  201. t.Errorf("%d: delete error : %s\n\n", i, err)
  202. }
  203. }
  204. }
  205. func checkFile(pluginDir string, etcDir string, t PluginType, name string, version string) error {
  206. soName := ucFirst(name) + ".so"
  207. if version != "" {
  208. soName = fmt.Sprintf("%s@v%s.so", ucFirst(name), version)
  209. }
  210. soPath := path.Join(pluginDir, PluginTypes[t], soName)
  211. _, err := os.Stat(soPath)
  212. if err != nil {
  213. return err
  214. }
  215. if t == SOURCE {
  216. etcPath := path.Join(etcDir, PluginTypes[t], name+".yaml")
  217. _, err = os.Stat(etcPath)
  218. if err != nil {
  219. return err
  220. }
  221. }
  222. return nil
  223. }