manager_test.go 4.5 KB

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