network_test.go 6.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244
  1. package controller
  2. import (
  3. "context"
  4. "os"
  5. "sync"
  6. "testing"
  7. "github.com/google/uuid"
  8. "github.com/gravitl/netmaker/database"
  9. "github.com/gravitl/netmaker/logger"
  10. "github.com/gravitl/netmaker/logic"
  11. "github.com/gravitl/netmaker/models"
  12. "github.com/stretchr/testify/assert"
  13. "golang.zx2c4.com/wireguard/wgctrl/wgtypes"
  14. )
  15. type NetworkValidationTestCase struct {
  16. testname string
  17. network models.Network
  18. errMessage string
  19. }
  20. var netHost models.Host
  21. func TestMain(m *testing.M) {
  22. database.InitializeDatabase()
  23. defer database.CloseDB()
  24. logic.CreateSuperAdmin(&models.User{
  25. UserName: "admin",
  26. Password: "password",
  27. IsAdmin: true,
  28. })
  29. peerUpdate := make(chan *models.Node)
  30. wg := &sync.WaitGroup{}
  31. wg.Add(1)
  32. go logic.ManageZombies(context.Background(), wg, peerUpdate)
  33. go func() {
  34. for update := range peerUpdate {
  35. //do nothing
  36. logger.Log(3, "received node update", update.Action)
  37. }
  38. }()
  39. os.Exit(m.Run())
  40. }
  41. func TestCreateNetwork(t *testing.T) {
  42. deleteAllNetworks()
  43. var network models.Network
  44. network.NetID = "skynet"
  45. network.AddressRange = "10.0.0.1/24"
  46. // if tests break - check here (removed displayname)
  47. //network.DisplayName = "mynetwork"
  48. _, err := logic.CreateNetwork(network)
  49. assert.Nil(t, err)
  50. }
  51. func TestGetNetwork(t *testing.T) {
  52. createNet()
  53. t.Run("GetExistingNetwork", func(t *testing.T) {
  54. network, err := logic.GetNetwork("skynet")
  55. assert.Nil(t, err)
  56. assert.Equal(t, "skynet", network.NetID)
  57. })
  58. t.Run("GetNonExistantNetwork", func(t *testing.T) {
  59. network, err := logic.GetNetwork("doesnotexist")
  60. assert.EqualError(t, err, "no result found")
  61. assert.Equal(t, "", network.NetID)
  62. })
  63. }
  64. func TestDeleteNetwork(t *testing.T) {
  65. createNet()
  66. //create nodes
  67. t.Run("NetworkwithNodes", func(t *testing.T) {
  68. })
  69. t.Run("DeleteExistingNetwork", func(t *testing.T) {
  70. err := logic.DeleteNetwork("skynet")
  71. assert.Nil(t, err)
  72. })
  73. t.Run("NonExistentNetwork", func(t *testing.T) {
  74. err := logic.DeleteNetwork("skynet")
  75. assert.Nil(t, err)
  76. })
  77. }
  78. func TestSecurityCheck(t *testing.T) {
  79. //these seem to work but not sure it the tests are really testing the functionality
  80. os.Setenv("MASTER_KEY", "secretkey")
  81. t.Run("NoNetwork", func(t *testing.T) {
  82. username, err := logic.UserPermissions(false, "Bearer secretkey")
  83. assert.Nil(t, err)
  84. t.Log(username)
  85. })
  86. t.Run("BadToken", func(t *testing.T) {
  87. username, err := logic.UserPermissions(false, "Bearer badkey")
  88. assert.NotNil(t, err)
  89. t.Log(err)
  90. t.Log(username)
  91. })
  92. }
  93. func TestValidateNetwork(t *testing.T) {
  94. //t.Skip()
  95. //This functions is not called by anyone
  96. //it panics as validation function 'display_name_valid' is not defined
  97. //yes := true
  98. //no := false
  99. //deleteNet(t)
  100. //DeleteNetworks
  101. cases := []NetworkValidationTestCase{
  102. {
  103. testname: "InvalidAddress",
  104. network: models.Network{
  105. NetID: "skynet",
  106. AddressRange: "10.0.0.256",
  107. },
  108. errMessage: "Field validation for 'AddressRange' failed on the 'cidrv4' tag",
  109. },
  110. {
  111. testname: "InvalidAddress6",
  112. network: models.Network{
  113. NetID: "skynet1",
  114. AddressRange6: "2607::ffff/130",
  115. },
  116. errMessage: "Field validation for 'AddressRange6' failed on the 'cidrv6' tag",
  117. },
  118. {
  119. testname: "InvalidNetID",
  120. network: models.Network{
  121. NetID: "with spaces",
  122. },
  123. errMessage: "Field validation for 'NetID' failed on the 'netid_valid' tag",
  124. },
  125. {
  126. testname: "NetIDTooLong",
  127. network: models.Network{
  128. NetID: "LongNetIDNameForMaxCharactersTest",
  129. },
  130. errMessage: "Field validation for 'NetID' failed on the 'max' tag",
  131. },
  132. {
  133. testname: "ListenPortTooLow",
  134. network: models.Network{
  135. NetID: "skynet",
  136. DefaultListenPort: 1023,
  137. },
  138. errMessage: "Field validation for 'DefaultListenPort' failed on the 'min' tag",
  139. },
  140. {
  141. testname: "ListenPortTooHigh",
  142. network: models.Network{
  143. NetID: "skynet",
  144. DefaultListenPort: 65536,
  145. },
  146. errMessage: "Field validation for 'DefaultListenPort' failed on the 'max' tag",
  147. },
  148. {
  149. testname: "KeepAliveTooBig",
  150. network: models.Network{
  151. NetID: "skynet",
  152. DefaultKeepalive: 1010,
  153. },
  154. errMessage: "Field validation for 'DefaultKeepalive' failed on the 'max' tag",
  155. },
  156. }
  157. for _, tc := range cases {
  158. t.Run(tc.testname, func(t *testing.T) {
  159. t.Log(tc.testname)
  160. network := models.Network(tc.network)
  161. network.SetDefaults()
  162. err := logic.ValidateNetwork(&network, false)
  163. assert.NotNil(t, err)
  164. assert.Contains(t, err.Error(), tc.errMessage) // test passes if err.Error() contains the expected errMessage.
  165. })
  166. }
  167. }
  168. func TestIpv6Network(t *testing.T) {
  169. //these seem to work but not sure it the tests are really testing the functionality
  170. os.Setenv("MASTER_KEY", "secretkey")
  171. deleteAllNetworks()
  172. createNet()
  173. createNetDualStack()
  174. network, err := logic.GetNetwork("skynet6")
  175. t.Run("Test Network Create IPv6", func(t *testing.T) {
  176. assert.Nil(t, err)
  177. assert.Equal(t, network.AddressRange6, "fde6:be04:fa5e:d076::/64")
  178. })
  179. node1 := createNodeWithParams("skynet6", "")
  180. createNetHost()
  181. nodeErr := logic.AssociateNodeToHost(node1, &netHost)
  182. t.Run("Test node on network IPv6", func(t *testing.T) {
  183. assert.Nil(t, nodeErr)
  184. assert.Equal(t, "fde6:be04:fa5e:d076::1", node1.Address6.IP.String())
  185. })
  186. }
  187. func deleteAllNetworks() {
  188. deleteAllNodes()
  189. database.DeleteAllRecords(database.NETWORKS_TABLE_NAME)
  190. }
  191. func createNet() {
  192. var network models.Network
  193. network.NetID = "skynet"
  194. network.AddressRange = "10.0.0.1/24"
  195. _, err := logic.GetNetwork("skynet")
  196. if err != nil {
  197. logic.CreateNetwork(network)
  198. }
  199. }
  200. func createNetDualStack() {
  201. var network models.Network
  202. network.NetID = "skynet6"
  203. network.AddressRange = "10.1.2.0/24"
  204. network.AddressRange6 = "fde6:be04:fa5e:d076::/64"
  205. network.IsIPv4 = "yes"
  206. network.IsIPv6 = "yes"
  207. _, err := logic.GetNetwork("skynet6")
  208. if err != nil {
  209. logic.CreateNetwork(network)
  210. }
  211. }
  212. func createNetHost() {
  213. k, _ := wgtypes.ParseKey("DM5qhLAE20PG9BbfBCger+Ac9D2NDOwCtY1rbYDLf34=")
  214. netHost = models.Host{
  215. ID: uuid.New(),
  216. PublicKey: k.PublicKey(),
  217. HostPass: "password",
  218. OS: "linux",
  219. Name: "nethost",
  220. }
  221. _ = logic.CreateHost(&netHost)
  222. }