api_test.go 8.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276
  1. package main
  2. import (
  3. "bytes"
  4. "context"
  5. "encoding/json"
  6. "io/ioutil"
  7. "net/http"
  8. "os"
  9. "sync"
  10. "testing"
  11. "time"
  12. controller "github.com/gravitl/netmaker/controllers"
  13. "github.com/gravitl/netmaker/models"
  14. "github.com/gravitl/netmaker/mongoconn"
  15. "github.com/stretchr/testify/assert"
  16. )
  17. //should be use models.SuccessResponse and models.SuccessfulUserLoginResponse
  18. //rather than creating new type but having trouble decoding that way
  19. type Auth struct {
  20. Username string
  21. AuthToken string
  22. }
  23. type Success struct {
  24. Code int
  25. Message string
  26. Response Auth
  27. }
  28. type AuthorizeTestCase struct {
  29. testname string
  30. name string
  31. password string
  32. code int
  33. tokenExpected bool
  34. errMessage string
  35. }
  36. var Networks []models.Network
  37. var baseURL string = "http://localhost:8081"
  38. func TestMain(m *testing.M) {
  39. mongoconn.ConnectDatabase()
  40. var waitgroup sync.WaitGroup
  41. waitgroup.Add(1)
  42. go controller.HandleRESTRequests(&waitgroup)
  43. var gconf models.GlobalConfig
  44. gconf.ServerGRPC = "localhost:8081"
  45. gconf.PortGRPC = "50051"
  46. //err := SetGlobalConfig(gconf)
  47. collection := mongoconn.Client.Database("netmaker").Collection("config")
  48. ctx, cancel := context.WithTimeout(context.Background(), 10*time.Second)
  49. defer cancel()
  50. //create, _, err := functions.GetGlobalConfig()
  51. _, err := collection.InsertOne(ctx, gconf)
  52. if err != nil {
  53. panic("could not create config store")
  54. }
  55. //wait for http server to start
  56. time.Sleep(time.Second * 1)
  57. os.Exit(m.Run())
  58. }
  59. func adminExists(t *testing.T) bool {
  60. response, err := http.Get("http://localhost:8081/api/users/adm/hasadmin")
  61. assert.Nil(t, err, err)
  62. assert.Equal(t, http.StatusOK, response.StatusCode)
  63. defer response.Body.Close()
  64. var body bool
  65. json.NewDecoder(response.Body).Decode(&body)
  66. return body
  67. }
  68. func api(t *testing.T, data interface{}, method, url, authorization string) (*http.Response, error) {
  69. var request *http.Request
  70. var err error
  71. if data != "" {
  72. payload, err := json.Marshal(data)
  73. assert.Nil(t, err, err)
  74. request, err = http.NewRequest(method, url, bytes.NewBuffer(payload))
  75. assert.Nil(t, err, err)
  76. request.Header.Set("Content-Type", "application/json")
  77. } else {
  78. request, err = http.NewRequest(method, url, nil)
  79. assert.Nil(t, err, err)
  80. }
  81. if authorization != "" {
  82. request.Header.Set("authorization", "Bearer "+authorization)
  83. }
  84. client := http.Client{}
  85. return client.Do(request)
  86. }
  87. func addAdmin(t *testing.T) {
  88. var admin models.User
  89. admin.UserName = "admin"
  90. admin.Password = "password"
  91. response, err := api(t, admin, http.MethodPost, baseURL+"/api/users/adm/createadmin", "secretkey")
  92. assert.Nil(t, err, err)
  93. assert.Equal(t, http.StatusOK, response.StatusCode)
  94. }
  95. func authenticate(t *testing.T) (string, error) {
  96. var admin models.User
  97. admin.UserName = "admin"
  98. admin.Password = "password"
  99. response, err := api(t, admin, http.MethodPost, baseURL+"/api/users/adm/authenticate", "secretkey")
  100. assert.Nil(t, err, err)
  101. var body Success
  102. err = json.NewDecoder(response.Body).Decode(&body)
  103. assert.Nil(t, err, err)
  104. assert.NotEmpty(t, body.Response.AuthToken, "token not returned")
  105. assert.Equal(t, "W1R3: Device admin Authorized", body.Message)
  106. return body.Response.AuthToken, nil
  107. }
  108. func deleteAdmin(t *testing.T) {
  109. if !adminExists(t) {
  110. return
  111. }
  112. token, err := authenticate(t)
  113. assert.Nil(t, err, err)
  114. _, err = api(t, "", http.MethodDelete, baseURL+"/api/users/admin", token)
  115. assert.Nil(t, err, err)
  116. }
  117. func createNetwork(t *testing.T) {
  118. network := models.Network{}
  119. network.NetID = "skynet"
  120. network.AddressRange = "10.71.0.0/16"
  121. response, err := api(t, network, http.MethodPost, baseURL+"/api/networks", "secretkey")
  122. assert.Nil(t, err, err)
  123. t.Log(err)
  124. assert.Equal(t, http.StatusOK, response.StatusCode)
  125. }
  126. func createKey(t *testing.T) {
  127. key := models.AccessKey{}
  128. key.Name = "skynet"
  129. key.Uses = 10
  130. response, err := api(t, key, http.MethodPost, baseURL+"/api/networks/skynet/keys", "secretkey")
  131. assert.Nil(t, err, err)
  132. assert.Equal(t, http.StatusOK, response.StatusCode)
  133. defer response.Body.Close()
  134. message, err := ioutil.ReadAll(response.Body)
  135. assert.Nil(t, err, err)
  136. assert.NotNil(t, message, message)
  137. }
  138. func createAccessKey(t *testing.T) (key models.AccessKey) {
  139. //delete existing key if
  140. _, _ = api(t, "", http.MethodDelete, baseURL+"/api/networks/skynet/keys/skynet", "secretkey")
  141. createkey := models.AccessKey{}
  142. createkey.Name = "skynet"
  143. createkey.Uses = 10
  144. response, err := api(t, createkey, http.MethodPost, baseURL+"/api/networks/skynet/keys", "secretkey")
  145. t.Log(err, response)
  146. assert.Nil(t, err, err)
  147. assert.Equal(t, http.StatusOK, response.StatusCode)
  148. defer response.Body.Close()
  149. err = json.NewDecoder(response.Body).Decode(&key)
  150. assert.Nil(t, err, err)
  151. t.Log("key is ", key)
  152. return key
  153. }
  154. func getKey(t *testing.T, name string) models.AccessKey {
  155. response, err := api(t, "", http.MethodGet, baseURL+"/api/networks/skynet/keys", "secretkey")
  156. assert.Nil(t, err, err)
  157. assert.Equal(t, http.StatusOK, response.StatusCode)
  158. defer response.Body.Close()
  159. var keys []models.AccessKey
  160. err = json.NewDecoder(response.Body).Decode(&keys)
  161. assert.Nil(t, err, err)
  162. for _, key := range keys {
  163. if key.Name == name {
  164. return key
  165. }
  166. }
  167. return models.AccessKey{}
  168. }
  169. func deleteKey(t *testing.T, key, network string) {
  170. response, err := api(t, "", http.MethodDelete, baseURL+"/api/networks/"+network+"/keys/"+key, "secretkey")
  171. assert.Nil(t, err, err)
  172. //api does not return Deleted Count at this time
  173. //defer response.Body.Close()
  174. //var message mongo.DeleteResult
  175. //err = json.NewDecoder(response.Body).Decode(&message)
  176. //assert.Nil(t, err, err)
  177. assert.Equal(t, http.StatusOK, response.StatusCode)
  178. //assert.Equal(t, int64(1), message.DeletedCount)
  179. }
  180. func deleteNetworks(t *testing.T) {
  181. //delete all node
  182. deleteAllNodes(t)
  183. response, err := api(t, "", http.MethodGet, baseURL+"/api/networks", "secretkey")
  184. assert.Nil(t, err, err)
  185. if response.StatusCode == http.StatusOK {
  186. defer response.Body.Close()
  187. err = json.NewDecoder(response.Body).Decode(&Networks)
  188. assert.Nil(t, err, err)
  189. for _, network := range Networks {
  190. name := network.NetID
  191. _, err := api(t, "", http.MethodDelete, baseURL+"/api/networks/"+name, "secretkey")
  192. assert.Nil(t, err, err)
  193. }
  194. }
  195. }
  196. func deleteNode(t *testing.T) {
  197. response, err := api(t, "", http.MethodDelete, baseURL+"/api/nodes/skynet/01:02:03:04:05:06", "secretkey")
  198. assert.Nil(t, err, err)
  199. assert.Equal(t, http.StatusOK, response.StatusCode)
  200. }
  201. func deleteAllNodes(t *testing.T) {
  202. response, err := api(t, "", http.MethodGet, baseURL+"/api/nodes", "secretkey")
  203. assert.Nil(t, err, err)
  204. assert.Equal(t, http.StatusOK, response.StatusCode)
  205. var nodes []models.ReturnNode
  206. defer response.Body.Close()
  207. json.NewDecoder(response.Body).Decode(&nodes)
  208. for _, node := range nodes {
  209. resp, err := api(t, "", http.MethodDelete, baseURL+"/api/nodes/"+node.Network+"/"+node.MacAddress, "secretkey")
  210. assert.Nil(t, err, err)
  211. assert.Equal(t, http.StatusOK, resp.StatusCode)
  212. }
  213. }
  214. func createNode(t *testing.T) {
  215. var node models.Node
  216. key := createAccessKey(t)
  217. node.Address = "10.71.0.1"
  218. node.AccessKey = key.Value
  219. node.MacAddress = "01:02:03:04:05:06"
  220. node.Name = "myNode"
  221. node.PublicKey = "DM5qhLAE20PG9BbfBCger+Ac9D2NDOwCtY1rbYDLf34="
  222. node.Password = "tobedetermined"
  223. node.Endpoint = "10.100.100.4"
  224. response, err := api(t, node, http.MethodPost, "http://localhost:8081:/api/nodes/skynet", "secretkey")
  225. assert.Nil(t, err, err)
  226. assert.Equal(t, http.StatusOK, response.StatusCode)
  227. }
  228. func getNode(t *testing.T) models.Node {
  229. response, err := api(t, "", http.MethodGet, baseURL+"/api/nodes/skynet/01:02:03:04:05:06", "secretkey")
  230. assert.Nil(t, err, err)
  231. assert.Equal(t, http.StatusOK, response.StatusCode)
  232. var node models.Node
  233. defer response.Body.Close()
  234. err = json.NewDecoder(response.Body).Decode(&node)
  235. assert.Nil(t, err, err)
  236. return node
  237. }
  238. func getNetwork(t *testing.T, network string) models.Network {
  239. var net models.Network
  240. response, err := api(t, "", http.MethodGet, baseURL+"/api/networks/"+network, "secretkey")
  241. assert.Nil(t, err, err)
  242. assert.Equal(t, http.StatusOK, response.StatusCode)
  243. defer response.Body.Close()
  244. err = json.NewDecoder(response.Body).Decode(&net)
  245. assert.Nil(t, err, err)
  246. return net
  247. }
  248. func setup(t *testing.T) {
  249. deleteNetworks(t)
  250. createNetwork(t)
  251. createNode(t)
  252. }