net_test.go 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470
  1. package ovpm
  2. import (
  3. "fmt"
  4. "net"
  5. "reflect"
  6. "testing"
  7. )
  8. func TestVPNCreateNewNetwork(t *testing.T) {
  9. // Initialize:
  10. setupTestCase()
  11. CreateDB("sqlite3", ":memory:")
  12. defer db.Cease()
  13. TheServer().Init("localhost", "", UDPProto, "", "", "", "", false)
  14. // Prepare:
  15. // Test:
  16. netName := "testnet"
  17. cidrStr := "192.168.1.0/24"
  18. netType := SERVERNET
  19. n, err := CreateNewNetwork(netName, cidrStr, netType, "")
  20. if err != nil {
  21. t.Fatalf("unexpected error when creating a new network: %v", err)
  22. }
  23. if n.Name != netName {
  24. t.Fatalf("network Name is expected to be '%s' but it's '%s' instead", netName, n.Name)
  25. }
  26. if n.CIDR != cidrStr {
  27. t.Fatalf("network CIDR is expected to be '%s' but it's '%s' instead", cidrStr, n.CIDR)
  28. }
  29. var network dbNetworkModel
  30. db.First(&network)
  31. if db.NewRecord(&network) {
  32. t.Fatalf("network is not created in the database.")
  33. }
  34. if network.Name != netName {
  35. t.Fatalf("network Name is expected to be '%s' but it's '%s' instead", netName, network.Name)
  36. }
  37. if network.CIDR != cidrStr {
  38. t.Fatalf("network CIDR is expected to be '%s' but it's '%s' instead", cidrStr, network.CIDR)
  39. }
  40. if network.Type != netType {
  41. t.Fatalf("network CIDR is expected to be '%s' but it's '%s' instead", netType, network.Type)
  42. }
  43. // Test username validation.
  44. var networknametests = []struct {
  45. networkname string
  46. ok bool
  47. }{
  48. {"asdf1240asfd", true},
  49. {"asdf.asfd", true},
  50. {"asdf12.12asfd", true},
  51. {"asd1f-as4fd", false},
  52. {"as0df a01sfd", false},
  53. {"as0df$a01sfd", false},
  54. {"as0df#a01sfd", false},
  55. {"a6sdf_as1fd", true},
  56. }
  57. for i, tt := range networknametests {
  58. _, err := CreateNewNetwork(tt.networkname, fmt.Sprintf("192.168.%d.0/24", i), SERVERNET, "")
  59. if ok := (err == nil); ok != tt.ok {
  60. t.Fatalf("expcted condition failed '%s': %v", tt.networkname, err)
  61. }
  62. }
  63. }
  64. func TestVPNDeleteNetwork(t *testing.T) {
  65. // Initialize:
  66. setupTestCase()
  67. CreateDB("sqlite3", ":memory:")
  68. defer db.Cease()
  69. TheServer().Init("localhost", "", UDPProto, "", "", "", "", false)
  70. // Prepare:
  71. // Test:
  72. netName := "testnet"
  73. cidrStr := "192.168.1.0/24"
  74. netType := SERVERNET
  75. n, err := CreateNewNetwork(netName, cidrStr, netType, "")
  76. if err != nil {
  77. t.Fatalf("unexpected error when creating a new network: %v", err)
  78. }
  79. var network dbNetworkModel
  80. db.First(&network)
  81. if db.NewRecord(&network) {
  82. t.Fatalf("network is not created in the database.")
  83. }
  84. err = n.Delete()
  85. if err != nil {
  86. t.Fatalf("can't delete network: %v", err)
  87. }
  88. // Empty the existing network object.
  89. network = dbNetworkModel{}
  90. db.First(&network)
  91. if !db.NewRecord(&network) {
  92. t.Fatalf("network is not deleted from the database. %+v", network)
  93. }
  94. }
  95. func TestVPNGetNetwork(t *testing.T) {
  96. // Initialize:
  97. setupTestCase()
  98. CreateDB("sqlite3", ":memory:")
  99. defer db.Cease()
  100. TheServer().Init("localhost", "", UDPProto, "", "", "", "", false)
  101. // Prepare:
  102. // Test:
  103. netName := "testnet"
  104. cidrStr := "192.168.1.0/24"
  105. netType := SERVERNET
  106. _, err := CreateNewNetwork(netName, cidrStr, netType, "")
  107. if err != nil {
  108. t.Fatalf("unexpected error when creating a new network: %v", err)
  109. }
  110. var network dbNetworkModel
  111. db.First(&network)
  112. if db.NewRecord(&network) {
  113. t.Fatalf("network is not created in the database.")
  114. }
  115. n, err := GetNetwork(netName)
  116. if err != nil {
  117. t.Fatalf("unexpected error: %v", err)
  118. }
  119. if db.NewRecord(&n.dbNetworkModel) {
  120. t.Fatalf("network is not correctly returned from db.")
  121. }
  122. }
  123. func TestVPNGetAllNetworks(t *testing.T) {
  124. // Initialize:
  125. setupTestCase()
  126. CreateDB("sqlite3", ":memory:")
  127. defer db.Cease()
  128. TheServer().Init("localhost", "", UDPProto, "", "", "", "", false)
  129. // Prepare:
  130. // Test:
  131. var getallnettests = []struct {
  132. name string
  133. cidr string
  134. netType NetworkType
  135. passing bool
  136. }{
  137. {"testnet1", "192.168.1.0/24", SERVERNET, true},
  138. {"testnet2", "10.10.0.0/16", SERVERNET, true},
  139. {"testnet3", "asdkfjadflsa", SERVERNET, false},
  140. }
  141. for _, tt := range getallnettests {
  142. _, err := CreateNewNetwork(tt.name, tt.cidr, tt.netType, "")
  143. if (err == nil) != tt.passing {
  144. t.Fatalf("unexpected error when creating a new network: %v", err)
  145. }
  146. }
  147. for _, tt := range getallnettests {
  148. n, err := GetNetwork(tt.name)
  149. if (err == nil) != tt.passing {
  150. t.Fatalf("network's presence is expected to be '%t' but it's '%t' instead", tt.passing, !tt.passing)
  151. }
  152. if tt.passing {
  153. if n.Name != tt.name {
  154. t.Fatalf("network Name is expected to be '%s' but it's '%s'", tt.name, n.Name)
  155. }
  156. if n.CIDR != tt.cidr {
  157. t.Fatalf("network CIDR is expected to be '%s' but it's '%s'", tt.cidr, n.CIDR)
  158. }
  159. if n.Type != tt.netType {
  160. t.Fatalf("network CIDR is expected to be '%s' but it's '%s' instead", tt.netType, n.Type)
  161. }
  162. }
  163. }
  164. }
  165. func TestNetAssociate(t *testing.T) {
  166. // Initialize:
  167. setupTestCase()
  168. CreateDB("sqlite3", ":memory:")
  169. defer db.Cease()
  170. TheServer().Init("localhost", "", UDPProto, "", "", "", "", false)
  171. // Prepare:
  172. // Test:
  173. netName := "testnet"
  174. cidrStr := "192.168.1.0/24"
  175. netType := SERVERNET
  176. userName := "testUser2"
  177. user, err := CreateNewUser(userName, "123", false, 0, true, "description")
  178. if err != nil {
  179. t.Fatal(err)
  180. }
  181. n, err := CreateNewNetwork(netName, cidrStr, netType, "")
  182. if err != nil {
  183. t.Fatal(err)
  184. }
  185. err = n.Associate(user.dbUserModel.Username)
  186. if err != nil {
  187. t.Fatal(err)
  188. }
  189. n = nil
  190. n, err = GetNetwork(netName)
  191. if err != nil {
  192. t.Fatal(err)
  193. }
  194. // Does number of associated users in the network object matches the number that we have created?
  195. if count := len(n.dbNetworkModel.Users); count != 1 {
  196. t.Fatalf("network.Users count is expexted to be %d, but it's %d", 1, count)
  197. }
  198. err = n.Associate(user.dbUserModel.Username)
  199. if err == nil {
  200. t.Fatalf("expected to get error but got no error instead")
  201. }
  202. }
  203. func TestNetDissociate(t *testing.T) {
  204. // Initialize:
  205. setupTestCase()
  206. CreateDB("sqlite3", ":memory:")
  207. defer db.Cease()
  208. if err := TheServer().Init("localhost", "", UDPProto, "", "", "", "", false); err != nil {
  209. t.Fatal(err)
  210. }
  211. // Prepare:
  212. // Test:
  213. netName := "testnet"
  214. cidrStr := "192.168.1.0/24"
  215. netType := SERVERNET
  216. userName := "testUser2"
  217. user, err := CreateNewUser(userName, "123", false, 0, true, "description")
  218. if err != nil {
  219. t.Fatal(err)
  220. }
  221. n, err := CreateNewNetwork(netName, cidrStr, netType, "")
  222. if err != nil {
  223. t.Fatal(err)
  224. }
  225. n.Associate(user.Username)
  226. n = nil
  227. n, _ = GetNetwork(netName)
  228. // Does number of associated users in the network object matches the number that we have created?
  229. if count := len(n.Users); count != 1 {
  230. t.Fatalf("network.Users count is expexted to be %d, but it's %d", 1, count)
  231. }
  232. err = n.Dissociate(user.Username)
  233. if err != nil {
  234. t.Fatalf("unexpected error: %v", err)
  235. }
  236. n = nil
  237. n, _ = GetNetwork(netName)
  238. // Does number of associated users in the network object matches the number that we have created?
  239. if count := len(n.Users); count != 0 {
  240. t.Fatalf("network.Users count is expexted to be %d, but it's %d", 0, count)
  241. }
  242. err = n.Dissociate(user.Username)
  243. if err == nil {
  244. t.Fatalf("expected error but got no error instead")
  245. }
  246. }
  247. func TestNetGetAssociatedUsers(t *testing.T) {
  248. // Initialize:
  249. setupTestCase()
  250. CreateDB("sqlite3", ":memory:")
  251. defer db.Cease()
  252. TheServer().Init("localhost", "", UDPProto, "", "", "", "", false)
  253. // Prepare:
  254. // Test:
  255. netName := "testnet"
  256. cidrStr := "192.168.1.0/24"
  257. netType := SERVERNET
  258. userName := "testUser2"
  259. user, _ := CreateNewUser(userName, "123", false, 0, true, "description")
  260. n, _ := CreateNewNetwork(netName, cidrStr, netType, "")
  261. n.Associate(user.Username)
  262. n = nil
  263. n, _ = GetNetwork(netName)
  264. // Test:
  265. if n.GetAssociatedUsers()[0].Username != user.Username {
  266. t.Fatalf("returned associated user is expected to be the same user with the one we have created, but its not")
  267. }
  268. }
  269. func TestNetworkTypeFromString(t *testing.T) {
  270. // Initialize:
  271. setupTestCase()
  272. CreateDB("sqlite3", ":memory:")
  273. defer db.Cease()
  274. TheServer().Init("localhost", "", UDPProto, "", "", "", "", false)
  275. // Test
  276. type args struct {
  277. typ string
  278. }
  279. tests := []struct {
  280. name string
  281. args args
  282. want NetworkType
  283. }{
  284. {"servernet", args{"SERVERNET"}, SERVERNET},
  285. {"route", args{"ROUTE"}, ROUTE},
  286. {"unknown", args{"aasdfsafdASDF"}, UNDEFINEDNET},
  287. }
  288. for _, tt := range tests {
  289. t.Run(tt.name, func(t *testing.T) {
  290. if got := NetworkTypeFromString(tt.args.typ); got != tt.want {
  291. t.Errorf("NetworkTypeFromString() = %v, want %v", got, tt.want)
  292. }
  293. })
  294. }
  295. }
  296. func TestGetAllNetworkTypes(t *testing.T) {
  297. // Initialize:
  298. setupTestCase()
  299. CreateDB("sqlite3", ":memory:")
  300. defer db.Cease()
  301. TheServer().Init("localhost", "", UDPProto, "", "", "", "", false)
  302. // Test
  303. tests := []struct {
  304. name string
  305. want []NetworkType
  306. }{
  307. {"default", []NetworkType{UNDEFINEDNET, SERVERNET, ROUTE}},
  308. }
  309. for _, tt := range tests {
  310. t.Run(tt.name, func(t *testing.T) {
  311. if got := GetAllNetworkTypes(); !reflect.DeepEqual(got, tt.want) {
  312. t.Errorf("GetAllNetworkTypes() = %v, want %v", got, tt.want)
  313. }
  314. })
  315. }
  316. }
  317. func TestIsNetworkType(t *testing.T) {
  318. // Initialize:
  319. setupTestCase()
  320. CreateDB("sqlite3", ":memory:")
  321. defer db.Cease()
  322. TheServer().Init("localhost", "", UDPProto, "", "", "", "", false)
  323. // Test
  324. type args struct {
  325. s string
  326. }
  327. tests := []struct {
  328. name string
  329. args args
  330. want bool
  331. }{
  332. {"servernet", args{"SERVERNET"}, true},
  333. {"route", args{"ROUTE"}, true},
  334. {"invalid", args{"ADSF"}, false},
  335. }
  336. for _, tt := range tests {
  337. t.Run(tt.name, func(t *testing.T) {
  338. if got := IsNetworkType(tt.args.s); got != tt.want {
  339. t.Errorf("IsNetworkType() = %v, want %v", got, tt.want)
  340. }
  341. })
  342. }
  343. }
  344. func TestIncrementIP(t *testing.T) {
  345. // Initialize:
  346. setupTestCase()
  347. CreateDB("sqlite3", ":memory:")
  348. defer db.Cease()
  349. TheServer().Init("localhost", "", UDPProto, "", "", "", "", false)
  350. // Test
  351. type args struct {
  352. ip string
  353. mask string
  354. }
  355. tests := []struct {
  356. name string
  357. args args
  358. want string
  359. wantErr bool
  360. }{
  361. {"default", args{"192.168.1.10", "255.255.255.0"}, "192.168.1.11", false},
  362. }
  363. for _, tt := range tests {
  364. t.Run(tt.name, func(t *testing.T) {
  365. got, err := IncrementIP(tt.args.ip, tt.args.mask)
  366. if (err != nil) != tt.wantErr {
  367. t.Errorf("IncrementIP() error = %v, wantErr %v", err, tt.wantErr)
  368. return
  369. }
  370. if got != tt.want {
  371. t.Errorf("IncrementIP() = %v, want %v", got, tt.want)
  372. }
  373. })
  374. }
  375. }
  376. func Test_routableIP(t *testing.T) {
  377. // Initialize:
  378. setupTestCase()
  379. CreateDB("sqlite3", ":memory:")
  380. defer db.Cease()
  381. TheServer().Init("localhost", "", UDPProto, "", "", "", "", false)
  382. // Test
  383. type args struct {
  384. network string
  385. ip net.IP
  386. }
  387. tests := []struct {
  388. name string
  389. args args
  390. want net.IP
  391. }{
  392. {"default", args{"ip4", net.ParseIP("0.0.0.0").To4()}, nil},
  393. {"local", args{"ip4", net.ParseIP("192.168.1.1").To4()}, net.ParseIP("192.168.1.1").To4()},
  394. {"v6linklocal", args{"ip6", net.ParseIP("FE80::").To16()}, net.ParseIP("FE80::").To16()},
  395. {"", args{"ip6", net.ParseIP("FE80::").To16()}, net.ParseIP("FE80::").To16()},
  396. }
  397. for _, tt := range tests {
  398. t.Run(tt.name, func(t *testing.T) {
  399. if got := routableIP(tt.args.network, tt.args.ip); !reflect.DeepEqual(got, tt.want) {
  400. t.Errorf("routableIP() = %v, want %v", got, tt.want)
  401. }
  402. })
  403. }
  404. }
  405. func init() {
  406. // Init
  407. Testing = true
  408. }