network_test.go 8.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305
  1. package controller
  2. import (
  3. "os"
  4. "testing"
  5. "github.com/gravitl/netmaker/database"
  6. "github.com/gravitl/netmaker/logic"
  7. "github.com/gravitl/netmaker/models"
  8. "github.com/gravitl/netmaker/serverctl"
  9. "github.com/stretchr/testify/assert"
  10. )
  11. type NetworkValidationTestCase struct {
  12. testname string
  13. network models.Network
  14. errMessage string
  15. }
  16. func TestCreateNetwork(t *testing.T) {
  17. database.InitializeDatabase()
  18. deleteAllNetworks()
  19. var network models.Network
  20. network.NetID = "skynet"
  21. network.AddressRange = "10.0.0.1/24"
  22. // if tests break - check here (removed displayname)
  23. //network.DisplayName = "mynetwork"
  24. err := logic.CreateNetwork(network)
  25. assert.Nil(t, err)
  26. }
  27. func TestGetNetwork(t *testing.T) {
  28. database.InitializeDatabase()
  29. createNet()
  30. t.Run("GetExistingNetwork", func(t *testing.T) {
  31. network, err := logic.GetNetwork("skynet")
  32. assert.Nil(t, err)
  33. assert.Equal(t, "skynet", network.NetID)
  34. })
  35. t.Run("GetNonExistantNetwork", func(t *testing.T) {
  36. network, err := logic.GetNetwork("doesnotexist")
  37. assert.EqualError(t, err, "no result found")
  38. assert.Equal(t, "", network.NetID)
  39. })
  40. }
  41. func TestDeleteNetwork(t *testing.T) {
  42. database.InitializeDatabase()
  43. createNet()
  44. //create nodes
  45. t.Run("NetworkwithNodes", func(t *testing.T) {
  46. })
  47. t.Run("DeleteExistingNetwork", func(t *testing.T) {
  48. err := logic.DeleteNetwork("skynet")
  49. assert.Nil(t, err)
  50. })
  51. t.Run("NonExistantNetwork", func(t *testing.T) {
  52. err := logic.DeleteNetwork("skynet")
  53. assert.Nil(t, err)
  54. })
  55. }
  56. func TestCreateKey(t *testing.T) {
  57. database.InitializeDatabase()
  58. createNet()
  59. keys, _ := logic.GetKeys("skynet")
  60. for _, key := range keys {
  61. logic.DeleteKey(key.Name, "skynet")
  62. }
  63. var accesskey models.AccessKey
  64. var network models.Network
  65. network.NetID = "skynet"
  66. t.Run("NameTooLong", func(t *testing.T) {
  67. network, err := logic.GetNetwork("skynet")
  68. assert.Nil(t, err)
  69. accesskey.Name = "Thisisareallylongkeynamethatwillfail"
  70. _, err = logic.CreateAccessKey(accesskey, network)
  71. assert.NotNil(t, err)
  72. assert.Contains(t, err.Error(), "Field validation for 'Name' failed on the 'max' tag")
  73. })
  74. t.Run("BlankName", func(t *testing.T) {
  75. network, err := logic.GetNetwork("skynet")
  76. assert.Nil(t, err)
  77. accesskey.Name = ""
  78. key, err := logic.CreateAccessKey(accesskey, network)
  79. assert.Nil(t, err)
  80. assert.NotEqual(t, "", key.Name)
  81. })
  82. t.Run("InvalidValue", func(t *testing.T) {
  83. network, err := logic.GetNetwork("skynet")
  84. assert.Nil(t, err)
  85. accesskey.Value = "bad-value"
  86. _, err = logic.CreateAccessKey(accesskey, network)
  87. assert.NotNil(t, err)
  88. assert.Contains(t, err.Error(), "Field validation for 'Value' failed on the 'alphanum' tag")
  89. })
  90. t.Run("BlankValue", func(t *testing.T) {
  91. network, err := logic.GetNetwork("skynet")
  92. assert.Nil(t, err)
  93. accesskey.Name = "mykey"
  94. accesskey.Value = ""
  95. key, err := logic.CreateAccessKey(accesskey, network)
  96. assert.Nil(t, err)
  97. assert.NotEqual(t, "", key.Value)
  98. assert.Equal(t, accesskey.Name, key.Name)
  99. })
  100. t.Run("ValueTooLong", func(t *testing.T) {
  101. network, err := logic.GetNetwork("skynet")
  102. assert.Nil(t, err)
  103. accesskey.Name = "keyname"
  104. accesskey.Value = "AccessKeyValuethatistoolong"
  105. _, err = logic.CreateAccessKey(accesskey, network)
  106. assert.NotNil(t, err)
  107. assert.Contains(t, err.Error(), "Field validation for 'Value' failed on the 'max' tag")
  108. })
  109. t.Run("BlankUses", func(t *testing.T) {
  110. network, err := logic.GetNetwork("skynet")
  111. assert.Nil(t, err)
  112. accesskey.Uses = 0
  113. accesskey.Value = ""
  114. key, err := logic.CreateAccessKey(accesskey, network)
  115. assert.Nil(t, err)
  116. assert.Equal(t, 1, key.Uses)
  117. })
  118. t.Run("DuplicateKey", func(t *testing.T) {
  119. network, err := logic.GetNetwork("skynet")
  120. assert.Nil(t, err)
  121. accesskey.Name = "mykey"
  122. _, err = logic.CreateAccessKey(accesskey, network)
  123. assert.NotNil(t, err)
  124. assert.EqualError(t, err, "duplicate AccessKey Name")
  125. })
  126. }
  127. func TestGetKeys(t *testing.T) {
  128. database.InitializeDatabase()
  129. deleteAllNetworks()
  130. createNet()
  131. network, err := logic.GetNetwork("skynet")
  132. assert.Nil(t, err)
  133. var key models.AccessKey
  134. key.Name = "mykey"
  135. _, err = logic.CreateAccessKey(key, network)
  136. assert.Nil(t, err)
  137. t.Run("KeyExists", func(t *testing.T) {
  138. keys, err := logic.GetKeys(network.NetID)
  139. assert.Nil(t, err)
  140. assert.NotEqual(t, models.AccessKey{}, keys)
  141. })
  142. t.Run("NonExistantKey", func(t *testing.T) {
  143. err := logic.DeleteKey("mykey", "skynet")
  144. assert.Nil(t, err)
  145. keys, err := logic.GetKeys(network.NetID)
  146. assert.Nil(t, err)
  147. assert.Equal(t, []models.AccessKey(nil), keys)
  148. })
  149. }
  150. func TestDeleteKey(t *testing.T) {
  151. database.InitializeDatabase()
  152. createNet()
  153. network, err := logic.GetNetwork("skynet")
  154. assert.Nil(t, err)
  155. var key models.AccessKey
  156. key.Name = "mykey"
  157. _, err = logic.CreateAccessKey(key, network)
  158. assert.Nil(t, err)
  159. t.Run("ExistingKey", func(t *testing.T) {
  160. err := logic.DeleteKey("mykey", "skynet")
  161. assert.Nil(t, err)
  162. })
  163. t.Run("NonExistantKey", func(t *testing.T) {
  164. err := logic.DeleteKey("mykey", "skynet")
  165. assert.NotNil(t, err)
  166. assert.Equal(t, "key mykey does not exist", err.Error())
  167. })
  168. }
  169. func TestSecurityCheck(t *testing.T) {
  170. //these seem to work but not sure it the tests are really testing the functionality
  171. database.InitializeDatabase()
  172. os.Setenv("MASTER_KEY", "secretkey")
  173. t.Run("NoNetwork", func(t *testing.T) {
  174. err, networks, username := SecurityCheck(false, "", "Bearer secretkey")
  175. assert.Nil(t, err)
  176. t.Log(networks, username)
  177. })
  178. t.Run("WithNetwork", func(t *testing.T) {
  179. err, networks, username := SecurityCheck(false, "skynet", "Bearer secretkey")
  180. assert.Nil(t, err)
  181. t.Log(networks, username)
  182. })
  183. t.Run("BadNet", func(t *testing.T) {
  184. t.Skip()
  185. err, networks, username := SecurityCheck(false, "badnet", "Bearer secretkey")
  186. assert.NotNil(t, err)
  187. t.Log(err)
  188. t.Log(networks, username)
  189. })
  190. t.Run("BadToken", func(t *testing.T) {
  191. err, networks, username := SecurityCheck(false, "skynet", "Bearer badkey")
  192. assert.NotNil(t, err)
  193. t.Log(err)
  194. t.Log(networks, username)
  195. })
  196. }
  197. func TestValidateNetworkUpdate(t *testing.T) {
  198. t.Skip()
  199. //This functions is not called by anyone
  200. //it panics as validation function 'display_name_valid' is not defined
  201. database.InitializeDatabase()
  202. //yes := true
  203. //no := false
  204. //deleteNet(t)
  205. //DeleteNetworks
  206. cases := []NetworkValidationTestCase{
  207. {
  208. testname: "InvalidAddress",
  209. network: models.Network{
  210. AddressRange: "10.0.0.256",
  211. },
  212. errMessage: "Field validation for 'AddressRange' failed on the 'cidr' tag",
  213. },
  214. {
  215. testname: "InvalidAddress6",
  216. network: models.Network{
  217. AddressRange6: "2607::ag",
  218. },
  219. errMessage: "Field validation for 'AddressRange6' failed on the 'cidr' tag",
  220. },
  221. {
  222. testname: "InvalidNetID",
  223. network: models.Network{
  224. NetID: "contains spaces",
  225. },
  226. errMessage: "Field validation for 'NetID' failed on the 'alphanum' tag",
  227. },
  228. {
  229. testname: "NetIDTooLong",
  230. network: models.Network{
  231. NetID: "LongNetIDName",
  232. },
  233. errMessage: "Field validation for 'NetID' failed on the 'max' tag",
  234. },
  235. {
  236. testname: "ListenPortTooLow",
  237. network: models.Network{
  238. DefaultListenPort: 1023,
  239. },
  240. errMessage: "Field validation for 'DefaultListenPort' failed on the 'min' tag",
  241. },
  242. {
  243. testname: "ListenPortTooHigh",
  244. network: models.Network{
  245. DefaultListenPort: 65536,
  246. },
  247. errMessage: "Field validation for 'DefaultListenPort' failed on the 'max' tag",
  248. },
  249. {
  250. testname: "KeepAliveTooBig",
  251. network: models.Network{
  252. DefaultKeepalive: 1010,
  253. },
  254. errMessage: "Field validation for 'DefaultKeepalive' failed on the 'max' tag",
  255. },
  256. {
  257. testname: "InvalidLocalRange",
  258. network: models.Network{
  259. LocalRange: "192.168.0.1",
  260. },
  261. errMessage: "Field validation for 'LocalRange' failed on the 'cidr' tag",
  262. },
  263. }
  264. for _, tc := range cases {
  265. t.Run(tc.testname, func(t *testing.T) {
  266. network := models.Network(tc.network)
  267. err := logic.ValidateNetworkUpdate(network)
  268. assert.NotNil(t, err)
  269. assert.Contains(t, err.Error(), tc.errMessage)
  270. })
  271. }
  272. }
  273. func deleteAllNetworks() {
  274. deleteAllNodes()
  275. nets, _ := logic.GetNetworks()
  276. for _, net := range nets {
  277. logic.DeleteNetwork(net.NetID)
  278. }
  279. }
  280. func createNet() {
  281. var network models.Network
  282. network.NetID = "skynet"
  283. network.AddressRange = "10.0.0.1/24"
  284. _, err := logic.GetNetwork("skynet")
  285. if err != nil {
  286. logic.CreateNetwork(network)
  287. }
  288. serverctl.InitializeCommsNetwork()
  289. }