net_test.go 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478
  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, err := CreateNewUser(userName, "123", false, 0, true, "description")
  260. if err != nil {
  261. t.Fatal(err)
  262. }
  263. n, err := CreateNewNetwork(netName, cidrStr, netType, "")
  264. if err != nil {
  265. t.Fatal(err)
  266. }
  267. if err := n.Associate(user.Username); err != nil {
  268. t.Fatal(err)
  269. }
  270. n = nil
  271. n, _ = GetNetwork(netName)
  272. // Test:
  273. if n.GetAssociatedUsers()[0].Username != user.Username {
  274. t.Fatalf("returned associated user is expected to be the same user with the one we have created, but its not")
  275. }
  276. }
  277. func TestNetworkTypeFromString(t *testing.T) {
  278. // Initialize:
  279. setupTestCase()
  280. CreateDB("sqlite3", ":memory:")
  281. defer db.Cease()
  282. TheServer().Init("localhost", "", UDPProto, "", "", "", "", false)
  283. // Test
  284. type args struct {
  285. typ string
  286. }
  287. tests := []struct {
  288. name string
  289. args args
  290. want NetworkType
  291. }{
  292. {"servernet", args{"SERVERNET"}, SERVERNET},
  293. {"route", args{"ROUTE"}, ROUTE},
  294. {"unknown", args{"aasdfsafdASDF"}, UNDEFINEDNET},
  295. }
  296. for _, tt := range tests {
  297. t.Run(tt.name, func(t *testing.T) {
  298. if got := NetworkTypeFromString(tt.args.typ); got != tt.want {
  299. t.Errorf("NetworkTypeFromString() = %v, want %v", got, tt.want)
  300. }
  301. })
  302. }
  303. }
  304. func TestGetAllNetworkTypes(t *testing.T) {
  305. // Initialize:
  306. setupTestCase()
  307. CreateDB("sqlite3", ":memory:")
  308. defer db.Cease()
  309. TheServer().Init("localhost", "", UDPProto, "", "", "", "", false)
  310. // Test
  311. tests := []struct {
  312. name string
  313. want []NetworkType
  314. }{
  315. {"default", []NetworkType{UNDEFINEDNET, SERVERNET, ROUTE}},
  316. }
  317. for _, tt := range tests {
  318. t.Run(tt.name, func(t *testing.T) {
  319. if got := GetAllNetworkTypes(); !reflect.DeepEqual(got, tt.want) {
  320. t.Errorf("GetAllNetworkTypes() = %v, want %v", got, tt.want)
  321. }
  322. })
  323. }
  324. }
  325. func TestIsNetworkType(t *testing.T) {
  326. // Initialize:
  327. setupTestCase()
  328. CreateDB("sqlite3", ":memory:")
  329. defer db.Cease()
  330. TheServer().Init("localhost", "", UDPProto, "", "", "", "", false)
  331. // Test
  332. type args struct {
  333. s string
  334. }
  335. tests := []struct {
  336. name string
  337. args args
  338. want bool
  339. }{
  340. {"servernet", args{"SERVERNET"}, true},
  341. {"route", args{"ROUTE"}, true},
  342. {"invalid", args{"ADSF"}, false},
  343. }
  344. for _, tt := range tests {
  345. t.Run(tt.name, func(t *testing.T) {
  346. if got := IsNetworkType(tt.args.s); got != tt.want {
  347. t.Errorf("IsNetworkType() = %v, want %v", got, tt.want)
  348. }
  349. })
  350. }
  351. }
  352. func TestIncrementIP(t *testing.T) {
  353. // Initialize:
  354. setupTestCase()
  355. CreateDB("sqlite3", ":memory:")
  356. defer db.Cease()
  357. TheServer().Init("localhost", "", UDPProto, "", "", "", "", false)
  358. // Test
  359. type args struct {
  360. ip string
  361. mask string
  362. }
  363. tests := []struct {
  364. name string
  365. args args
  366. want string
  367. wantErr bool
  368. }{
  369. {"default", args{"192.168.1.10", "255.255.255.0"}, "192.168.1.11", false},
  370. }
  371. for _, tt := range tests {
  372. t.Run(tt.name, func(t *testing.T) {
  373. got, err := IncrementIP(tt.args.ip, tt.args.mask)
  374. if (err != nil) != tt.wantErr {
  375. t.Errorf("IncrementIP() error = %v, wantErr %v", err, tt.wantErr)
  376. return
  377. }
  378. if got != tt.want {
  379. t.Errorf("IncrementIP() = %v, want %v", got, tt.want)
  380. }
  381. })
  382. }
  383. }
  384. func Test_routableIP(t *testing.T) {
  385. // Initialize:
  386. setupTestCase()
  387. CreateDB("sqlite3", ":memory:")
  388. defer db.Cease()
  389. TheServer().Init("localhost", "", UDPProto, "", "", "", "", false)
  390. // Test
  391. type args struct {
  392. network string
  393. ip net.IP
  394. }
  395. tests := []struct {
  396. name string
  397. args args
  398. want net.IP
  399. }{
  400. {"default", args{"ip4", net.ParseIP("0.0.0.0").To4()}, nil},
  401. {"local", args{"ip4", net.ParseIP("192.168.1.1").To4()}, net.ParseIP("192.168.1.1").To4()},
  402. {"v6linklocal", args{"ip6", net.ParseIP("FE80::").To16()}, net.ParseIP("FE80::").To16()},
  403. {"", args{"ip6", net.ParseIP("FE80::").To16()}, net.ParseIP("FE80::").To16()},
  404. }
  405. for _, tt := range tests {
  406. t.Run(tt.name, func(t *testing.T) {
  407. if got := routableIP(tt.args.network, tt.args.ip); !reflect.DeepEqual(got, tt.want) {
  408. t.Errorf("routableIP() = %v, want %v", got, tt.want)
  409. }
  410. })
  411. }
  412. }
  413. func init() {
  414. // Init
  415. Testing = true
  416. }