networkHttpController_test.go 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394
  1. package controller
  2. import (
  3. "testing"
  4. "time"
  5. "github.com/gravitl/netmaker/models"
  6. "github.com/stretchr/testify/assert"
  7. )
  8. type NetworkValidationTestCase struct {
  9. testname string
  10. network models.Network
  11. errMessage string
  12. }
  13. func deleteNet() {
  14. _, err := GetNetwork("skynet")
  15. if err == nil {
  16. _, _ = DeleteNetwork("skynet")
  17. }
  18. }
  19. func createNet() {
  20. var network models.Network
  21. network.NetID = "skynet"
  22. network.AddressRange = "10.0.0.1/24"
  23. network.DisplayName = "mynetwork"
  24. _, err := GetNetwork("skynet")
  25. if err != nil {
  26. CreateNetwork(network)
  27. }
  28. }
  29. func TestGetNetworks(t *testing.T) {
  30. //calls functions.ListNetworks --- nothing to be done
  31. }
  32. func TestCreateNetwork(t *testing.T) {
  33. deleteNet()
  34. var network models.Network
  35. network.NetID = "skynet"
  36. network.AddressRange = "10.0.0.1/24"
  37. network.DisplayName = "mynetwork"
  38. err := CreateNetwork(network)
  39. assert.Nil(t, err)
  40. }
  41. func TestGetDeleteNetwork(t *testing.T) {
  42. createNet()
  43. //create nodes
  44. t.Run("NetworkwithNodes", func(t *testing.T) {
  45. })
  46. t.Run("GetExistingNetwork", func(t *testing.T) {
  47. network, err := GetNetwork("skynet")
  48. assert.Nil(t, err)
  49. assert.Equal(t, "skynet", network.NetID)
  50. })
  51. t.Run("DeleteExistingNetwork", func(t *testing.T) {
  52. result, err := DeleteNetwork("skynet")
  53. assert.Nil(t, err)
  54. assert.Equal(t, int64(1), result.DeletedCount)
  55. t.Log(result.DeletedCount)
  56. })
  57. t.Run("GetNonExistantNetwork", func(t *testing.T) {
  58. network, err := GetNetwork("skynet")
  59. assert.NotNil(t, err)
  60. assert.Equal(t, "mongo: no documents in result", err.Error())
  61. assert.Equal(t, "", network.NetID)
  62. })
  63. t.Run("NonExistantNetwork", func(t *testing.T) {
  64. result, err := DeleteNetwork("skynet")
  65. assert.Nil(t, err)
  66. assert.Equal(t, int64(0), result.DeletedCount)
  67. t.Log(result.DeletedCount)
  68. })
  69. }
  70. func TestGetNetwork(t *testing.T) {
  71. }
  72. func TestUpdateNetwork(t *testing.T) {
  73. }
  74. func TestKeyUpdate(t *testing.T) {
  75. createNet()
  76. existing, err := GetNetwork("skynet")
  77. assert.Nil(t, err)
  78. time.Sleep(time.Second * 1)
  79. network, err := KeyUpdate("skynet")
  80. assert.Nil(t, err)
  81. network, err = GetNetwork("skynet")
  82. assert.Nil(t, err)
  83. assert.Greater(t, network.KeyUpdateTimeStamp, existing.KeyUpdateTimeStamp)
  84. }
  85. func TestCreateKey(t *testing.T) {
  86. createNet()
  87. var accesskey models.AccessKey
  88. var network models.Network
  89. network.NetID = "skynet"
  90. t.Run("InvalidName", func(t *testing.T) {
  91. network, err := GetNetwork("skynet")
  92. assert.Nil(t, err)
  93. accesskey.Name = "bad-name"
  94. _, err = CreateAccessKey(accesskey, network)
  95. assert.NotNil(t, err)
  96. assert.Contains(t, err.Error(), "Field validation for 'Name' failed on the 'alphanum' tag")
  97. })
  98. t.Run("NameTooLong", func(t *testing.T) {
  99. network, err := GetNetwork("skynet")
  100. assert.Nil(t, err)
  101. accesskey.Name = "Thisisareallylongkeynamethatwillfail"
  102. _, err = CreateAccessKey(accesskey, network)
  103. assert.NotNil(t, err)
  104. assert.Contains(t, err.Error(), "Field validation for 'Name' failed on the 'max' tag")
  105. })
  106. t.Run("BlankName", func(t *testing.T) {
  107. network, err := GetNetwork("skynet")
  108. assert.Nil(t, err)
  109. accesskey.Name = ""
  110. key, err := CreateAccessKey(accesskey, network)
  111. assert.Nil(t, err)
  112. assert.NotEqual(t, "", key.Name)
  113. })
  114. t.Run("InvalidValue", func(t *testing.T) {
  115. network, err := GetNetwork("skynet")
  116. assert.Nil(t, err)
  117. accesskey.Value = "bad-value"
  118. _, err = CreateAccessKey(accesskey, network)
  119. assert.NotNil(t, err)
  120. assert.Contains(t, err.Error(), "Field validation for 'Value' failed on the 'alphanum' tag")
  121. })
  122. t.Run("BlankValue", func(t *testing.T) {
  123. network, err := GetNetwork("skynet")
  124. assert.Nil(t, err)
  125. accesskey.Name = "mykey"
  126. accesskey.Value = ""
  127. key, err := CreateAccessKey(accesskey, network)
  128. assert.Nil(t, err)
  129. assert.NotEqual(t, "", key.Value)
  130. assert.Equal(t, accesskey.Name, key.Name)
  131. })
  132. t.Run("ValueTooLong", func(t *testing.T) {
  133. network, err := GetNetwork("skynet")
  134. assert.Nil(t, err)
  135. accesskey.Name = "keyname"
  136. accesskey.Value = "AccessKeyValuethatistoolong"
  137. _, err = CreateAccessKey(accesskey, network)
  138. assert.NotNil(t, err)
  139. assert.Contains(t, err.Error(), "Field validation for 'Value' failed on the 'max' tag")
  140. })
  141. t.Run("BlankUses", func(t *testing.T) {
  142. network, err := GetNetwork("skynet")
  143. assert.Nil(t, err)
  144. accesskey.Uses = 0
  145. accesskey.Value = ""
  146. key, err := CreateAccessKey(accesskey, network)
  147. assert.Nil(t, err)
  148. assert.Equal(t, 1, key.Uses)
  149. })
  150. t.Run("DuplicateKey", func(t *testing.T) {
  151. network, err := GetNetwork("skynet")
  152. assert.Nil(t, err)
  153. accesskey.Name = "mykey"
  154. _, err = CreateAccessKey(accesskey, network)
  155. assert.NotNil(t, err)
  156. assert.Equal(t, "Duplicate AccessKey Name", err.Error())
  157. })
  158. }
  159. func TestGetKeys(t *testing.T) {
  160. deleteNet()
  161. createNet()
  162. network, err := GetNetwork("skynet")
  163. assert.Nil(t, err)
  164. var key models.AccessKey
  165. key.Name = "mykey"
  166. _, err = CreateAccessKey(key, network)
  167. assert.Nil(t, err)
  168. t.Run("KeyExists", func(t *testing.T) {
  169. keys, err := GetKeys(network.NetID)
  170. assert.Nil(t, err)
  171. assert.NotEqual(t, models.AccessKey{}, keys)
  172. })
  173. t.Run("NonExistantKey", func(t *testing.T) {
  174. err := DeleteKey("mykey", "skynet")
  175. assert.Nil(t, err)
  176. keys, err := GetKeys(network.NetID)
  177. assert.Nil(t, err)
  178. assert.Equal(t, []models.AccessKey(nil), keys)
  179. })
  180. }
  181. func TestDeleteKey(t *testing.T) {
  182. createNet()
  183. network, err := GetNetwork("skynet")
  184. assert.Nil(t, err)
  185. var key models.AccessKey
  186. key.Name = "mykey"
  187. _, err = CreateAccessKey(key, network)
  188. assert.Nil(t, err)
  189. t.Run("ExistingKey", func(t *testing.T) {
  190. err := DeleteKey("mykey", "skynet")
  191. assert.Nil(t, err)
  192. })
  193. t.Run("NonExistantKey", func(t *testing.T) {
  194. err := DeleteKey("mykey", "skynet")
  195. assert.NotNil(t, err)
  196. assert.Equal(t, "key mykey does not exist", err.Error())
  197. })
  198. }
  199. func TestSecurityCheck(t *testing.T) {
  200. }
  201. func TestValidateNetworkUpdate(t *testing.T) {
  202. }
  203. func TestValidateNetworkCreate(t *testing.T) {
  204. yes := true
  205. no := false
  206. deleteNet()
  207. //DeleteNetworks
  208. cases := []NetworkValidationTestCase{
  209. NetworkValidationTestCase{
  210. testname: "InvalidAddress",
  211. network: models.Network{
  212. AddressRange: "10.0.0.256",
  213. NetID: "skynet",
  214. IsDualStack: &no,
  215. },
  216. errMessage: "Field validation for 'AddressRange' failed on the 'cidr' tag",
  217. },
  218. NetworkValidationTestCase{
  219. testname: "BadDisplayName",
  220. network: models.Network{
  221. AddressRange: "10.0.0.1/24",
  222. NetID: "skynet",
  223. DisplayName: "skynet*",
  224. IsDualStack: &no,
  225. },
  226. errMessage: "Field validation for 'DisplayName' failed on the 'alphanum' tag",
  227. },
  228. NetworkValidationTestCase{
  229. testname: "DisplayNameTooLong",
  230. network: models.Network{
  231. AddressRange: "10.0.0.1/24",
  232. NetID: "skynet",
  233. DisplayName: "Thisisareallylongdisplaynamethatistoolong",
  234. IsDualStack: &no,
  235. },
  236. errMessage: "Field validation for 'DisplayName' failed on the 'max' tag",
  237. },
  238. NetworkValidationTestCase{
  239. testname: "DisplayNameTooShort",
  240. network: models.Network{
  241. AddressRange: "10.0.0.1/24",
  242. NetID: "skynet",
  243. DisplayName: "1",
  244. IsDualStack: &no,
  245. },
  246. errMessage: "Field validation for 'DisplayName' failed on the 'min' tag",
  247. },
  248. NetworkValidationTestCase{
  249. testname: "NetIDMissing",
  250. network: models.Network{
  251. AddressRange: "10.0.0.1/24",
  252. IsDualStack: &no,
  253. },
  254. errMessage: "Field validation for 'NetID' failed on the 'required' tag",
  255. },
  256. NetworkValidationTestCase{
  257. testname: "InvalidNetID",
  258. network: models.Network{
  259. AddressRange: "10.0.0.1/24",
  260. NetID: "contains spaces",
  261. IsDualStack: &no,
  262. },
  263. errMessage: "Field validation for 'NetID' failed on the 'alphanum' tag",
  264. },
  265. NetworkValidationTestCase{
  266. testname: "NetIDTooShort",
  267. network: models.Network{
  268. AddressRange: "10.0.0.1/24",
  269. NetID: "",
  270. IsDualStack: &no,
  271. },
  272. errMessage: "Field validation for 'NetID' failed on the 'required' tag",
  273. },
  274. NetworkValidationTestCase{
  275. testname: "NetIDTooLong",
  276. network: models.Network{
  277. AddressRange: "10.0.0.1/24",
  278. NetID: "LongNetIDName",
  279. IsDualStack: &no,
  280. },
  281. errMessage: "Field validation for 'NetID' failed on the 'max' tag",
  282. },
  283. NetworkValidationTestCase{
  284. testname: "ListenPortTooLow",
  285. network: models.Network{
  286. AddressRange: "10.0.0.1/24",
  287. NetID: "skynet",
  288. DefaultListenPort: 1023,
  289. IsDualStack: &no,
  290. },
  291. errMessage: "Field validation for 'DefaultListenPort' failed on the 'min' tag",
  292. },
  293. NetworkValidationTestCase{
  294. testname: "ListenPortTooHigh",
  295. network: models.Network{
  296. AddressRange: "10.0.0.1/24",
  297. NetID: "skynet",
  298. DefaultListenPort: 65536,
  299. IsDualStack: &no,
  300. },
  301. errMessage: "Field validation for 'DefaultListenPort' failed on the 'max' tag",
  302. },
  303. NetworkValidationTestCase{
  304. testname: "KeepAliveTooBig",
  305. network: models.Network{
  306. AddressRange: "10.0.0.1/24",
  307. NetID: "skynet",
  308. DefaultKeepalive: 1010,
  309. IsDualStack: &no,
  310. },
  311. errMessage: "Field validation for 'DefaultKeepalive' failed on the 'max' tag",
  312. },
  313. NetworkValidationTestCase{
  314. testname: "InvalidLocalRange",
  315. network: models.Network{
  316. AddressRange: "10.0.0.1/24",
  317. NetID: "skynet",
  318. LocalRange: "192.168.0.1",
  319. IsDualStack: &no,
  320. },
  321. errMessage: "Field validation for 'LocalRange' failed on the 'cidr' tag",
  322. },
  323. NetworkValidationTestCase{
  324. testname: "DualStackWithoutIPv6",
  325. network: models.Network{
  326. AddressRange: "10.0.0.1/24",
  327. NetID: "skynet",
  328. IsDualStack: &yes,
  329. },
  330. errMessage: "Field validation for 'AddressRange6' failed on the 'addressrange6_valid' tag",
  331. },
  332. NetworkValidationTestCase{
  333. testname: "CheckInIntervalTooBig",
  334. network: models.Network{
  335. AddressRange: "10.0.0.1/24",
  336. NetID: "skynet",
  337. IsDualStack: &no,
  338. DefaultCheckInInterval: 100001,
  339. },
  340. errMessage: "Field validation for 'DefaultCheckInInterval' failed on the 'max' tag",
  341. },
  342. NetworkValidationTestCase{
  343. testname: "CheckInIntervalTooSmall",
  344. network: models.Network{
  345. AddressRange: "10.0.0.1/24",
  346. NetID: "skynet",
  347. IsDualStack: &no,
  348. DefaultCheckInInterval: 1,
  349. },
  350. errMessage: "Field validation for 'DefaultCheckInInterval' failed on the 'min' tag",
  351. },
  352. }
  353. for _, tc := range cases {
  354. t.Run(tc.testname, func(t *testing.T) {
  355. err := ValidateNetworkCreate(tc.network)
  356. assert.NotNil(t, err)
  357. assert.Contains(t, err.Error(), tc.errMessage)
  358. })
  359. }
  360. t.Run("DuplicateNetID", func(t *testing.T) {
  361. var net1, net2 models.Network
  362. net1.NetID = "skynet"
  363. net1.AddressRange = "10.0.0.1/24"
  364. net1.DisplayName = "mynetwork"
  365. net2.NetID = "skynet"
  366. net2.AddressRange = "10.0.1.1/24"
  367. net2.IsDualStack = &no
  368. err := CreateNetwork(net1)
  369. assert.Nil(t, err)
  370. err = ValidateNetworkCreate(net2)
  371. assert.NotNil(t, err)
  372. assert.Contains(t, err.Error(), "Field validation for 'NetID' failed on the 'netid_valid' tag")
  373. })
  374. t.Run("DuplicateDisplayName", func(t *testing.T) {
  375. var network models.Network
  376. network.NetID = "wirecat"
  377. network.AddressRange = "10.0.100.1/24"
  378. network.IsDualStack = &no
  379. network.DisplayName = "mynetwork"
  380. err := ValidateNetworkCreate(network)
  381. assert.NotNil(t, err)
  382. assert.Contains(t, err.Error(), "Field validation for 'DisplayName' failed on the 'displayname_unique' tag")
  383. })
  384. }