vpn_test.go 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571
  1. package ovpm
  2. import (
  3. "io"
  4. "strings"
  5. "testing"
  6. "time"
  7. "github.com/Sirupsen/logrus"
  8. "github.com/cad/ovpm/supervisor"
  9. )
  10. var fs map[string]string
  11. func setupTestCase() {
  12. // Initialize.
  13. fs = make(map[string]string)
  14. vpnProc.Stop()
  15. }
  16. func TestVPNInit(t *testing.T) {
  17. // Init:
  18. setupTestCase()
  19. CreateDB("sqlite3", ":memory:")
  20. defer db.Cease()
  21. // Prepare:
  22. // Test:
  23. // Check database if the database has no server.
  24. var server dbServerModel
  25. db.First(&server)
  26. // Isn't server empty struct?
  27. if !db.NewRecord(&server) {
  28. t.Fatalf("server is expected to be empty struct(new record) but it isn't %+v", server)
  29. }
  30. // Wrongfully initialize server.
  31. if err := TheServer().Init("localhost", "asdf", UDPProto, "", ""); err == nil {
  32. t.Fatalf("error is expected to be not nil but it's nil instead")
  33. }
  34. // Initialize the server.
  35. TheServer().Init("localhost", "", UDPProto, "", "")
  36. // Check database if the database has no server.
  37. var server2 dbServerModel
  38. db.First(&server2)
  39. // Is server empty struct?
  40. if db.NewRecord(&server2) {
  41. t.Fatalf("server is expected to be not empty struct(new record) but it is %+v", server2)
  42. }
  43. }
  44. func TestVPNDeinit(t *testing.T) {
  45. // Init:
  46. setupTestCase()
  47. CreateDB("sqlite3", ":memory:")
  48. defer db.Cease()
  49. // Prepare:
  50. // Initialize the server.
  51. TheServer().Init("localhost", "", UDPProto, "", "")
  52. u, err := CreateNewUser("user", "p", false, 0, true)
  53. if err != nil {
  54. t.Fatal(err)
  55. }
  56. u.Delete()
  57. // Test:
  58. var server dbServerModel
  59. db.First(&server)
  60. // Isn't server empty struct?
  61. if db.NewRecord(&server) {
  62. t.Fatalf("server is expected to be not empty struct(new record) but it is %+v", server)
  63. }
  64. // Test if Revoked table contains the removed user's entries.
  65. var revoked dbRevokedModel
  66. db.First(&revoked)
  67. if db.NewRecord(&revoked) {
  68. t.Errorf("revoked shouldn't be empty")
  69. }
  70. // Deinitialize.
  71. TheServer().Deinit()
  72. // Get server from db.
  73. var server2 dbServerModel
  74. db.First(&server2)
  75. // Isn't server empty struct?
  76. if !db.NewRecord(&server2) {
  77. t.Fatalf("server is expected to be empty struct(new record) but it is not %+v", server2)
  78. }
  79. // Test if Revoked table contains the removed user's entries.
  80. var revoked2 dbRevokedModel
  81. db.First(&revoked2)
  82. // Is revoked empty?
  83. if !db.NewRecord(&revoked2) {
  84. t.Errorf("revoked should be empty")
  85. }
  86. }
  87. func TestVPNUpdate(t *testing.T) {
  88. // Init:
  89. setupTestCase()
  90. CreateDB("sqlite3", ":memory:")
  91. defer db.Cease()
  92. // Prepare:
  93. TheServer().Init("localhost", "", UDPProto, "", "")
  94. // Test:
  95. var updatetests = []struct {
  96. vpnnet string
  97. dns string
  98. vpnChanged bool
  99. dnsChanged bool
  100. }{
  101. {"", "", false, false},
  102. {"192.168.9.0/24", "", true, false},
  103. {"", "2.2.2.2", false, true},
  104. {"9.9.9.0/24", "1.1.1.1", true, true},
  105. }
  106. for _, tt := range updatetests {
  107. svr := TheServer()
  108. oldIP := svr.Net
  109. oldDNS := svr.DNS
  110. svr.Update(tt.vpnnet, tt.dns)
  111. svr = nil
  112. svr = TheServer()
  113. if (svr.Net != oldIP) != tt.vpnChanged {
  114. t.Fatalf("expected vpn change: %t but opposite happened", tt.vpnChanged)
  115. }
  116. if (svr.DNS != oldDNS) != tt.dnsChanged {
  117. t.Fatalf("expected vpn change: %t but opposite happened", tt.dnsChanged)
  118. }
  119. }
  120. }
  121. func TestVPNIsInitialized(t *testing.T) {
  122. // Init:
  123. setupTestCase()
  124. CreateDB("sqlite3", ":memory:")
  125. defer db.Cease()
  126. // Prepare:
  127. // Test:
  128. // Is initialized?
  129. if TheServer().IsInitialized() {
  130. t.Fatalf("IsInitialized() is expected to return false but it returned true")
  131. }
  132. // Initialize the server.
  133. TheServer().Init("localhost", "", UDPProto, "", "")
  134. // Isn't initialized?
  135. if !TheServer().IsInitialized() {
  136. t.Fatalf("IsInitialized() is expected to return true but it returned false")
  137. }
  138. }
  139. func TestVPNTheServer(t *testing.T) {
  140. // Init:
  141. setupTestCase()
  142. CreateDB("sqlite3", ":memory:")
  143. defer db.Cease()
  144. // Prepare:
  145. // Test:
  146. svr := TheServer()
  147. // Isn't server nil?
  148. if svr.IsInitialized() {
  149. t.Fatal("server is expected to be not initialized it is")
  150. }
  151. // Initialize server.
  152. svr.Init("localhost", "", UDPProto, "", "")
  153. svr = TheServer()
  154. // Is server nil?
  155. if !svr.IsInitialized() {
  156. t.Fatal("server is expected to be initialized but it's not")
  157. }
  158. }
  159. func TestVPNDumpsClientConfig(t *testing.T) {
  160. // Init:
  161. setupTestCase()
  162. CreateDB("sqlite3", ":memory:")
  163. defer db.Cease()
  164. svr := TheServer()
  165. svr.Init("localhost", "", UDPProto, "", "")
  166. // Prepare:
  167. user, _ := CreateNewUser("user", "password", false, 0, true)
  168. // Test:
  169. clientConfigBlob, err := svr.DumpsClientConfig(user.GetUsername())
  170. if err != nil {
  171. t.Fatalf("expected to dump client config but we got error instead: %v", err)
  172. }
  173. // Is empty?
  174. if len(clientConfigBlob) == 0 {
  175. t.Fatal("expected the dump not empty but it's empty instead")
  176. }
  177. }
  178. func TestVPNDumpClientConfig(t *testing.T) {
  179. // Init:
  180. setupTestCase()
  181. CreateDB("sqlite3", ":memory:")
  182. defer db.Cease()
  183. svr := TheServer()
  184. svr.Init("localhost", "", UDPProto, "", "")
  185. // Prepare:
  186. noGW := false
  187. user, err := CreateNewUser("user", "password", noGW, 0, true)
  188. if err != nil {
  189. t.Fatalf("can not create user: %v", err)
  190. }
  191. // Test:
  192. if err = svr.DumpClientConfig(user.GetUsername(), "/tmp/user.ovpn"); err != nil {
  193. t.Fatalf("expected to dump client config but we got error instead: %v", err)
  194. }
  195. // Read file.
  196. clientConfigBlob := fs["/tmp/user.ovpn"]
  197. // Is empty?
  198. if len(clientConfigBlob) == 0 {
  199. t.Fatal("expected the dump not empty but it's empty instead")
  200. }
  201. // Is noGW honored?
  202. if strings.Contains(clientConfigBlob, "route-nopull") != noGW {
  203. logrus.Info(clientConfigBlob)
  204. t.Fatalf("client config generator doesn't honor NoGW")
  205. }
  206. user.Delete()
  207. noGW = true
  208. user, err = CreateNewUser("user", "password", noGW, 0, true)
  209. if err != nil {
  210. t.Fatalf("can not create user: %v", err)
  211. }
  212. if err = TheServer().DumpClientConfig(user.GetUsername(), "/tmp/user.ovpn"); err != nil {
  213. t.Fatalf("expected to dump client config but we got error instead: %v", err)
  214. }
  215. // Read file.
  216. clientConfigBlob = fs["/tmp/user.ovpn"]
  217. }
  218. func TestVPNGetSystemCA(t *testing.T) {
  219. // Init:
  220. setupTestCase()
  221. CreateDB("sqlite3", ":memory:")
  222. defer db.Cease()
  223. // Prepare:
  224. svr := TheServer()
  225. // Test:
  226. ca, err := svr.GetSystemCA()
  227. if err == nil {
  228. t.Fatalf("GetSystemCA() is expected to give error but it didn't instead")
  229. }
  230. // Initialize system.
  231. svr.Init("localhost", "", UDPProto, "", "")
  232. ca, err = svr.GetSystemCA()
  233. if err != nil {
  234. t.Fatalf("GetSystemCA() is expected to get system ca, but it gave us an error instead: %v", err)
  235. }
  236. // Is it empty?
  237. if len(ca.Cert) == 0 {
  238. t.Fatalf("ca.Cert is expected to be not empty, but it's empty instead")
  239. }
  240. if len(ca.Key) == 0 {
  241. t.Fatalf("ca.Key is expected to be not empty, but it's empty instead")
  242. }
  243. }
  244. func TestVPNStartVPNProc(t *testing.T) {
  245. // Init:
  246. setupTestCase()
  247. CreateDB("sqlite3", ":memory:")
  248. defer db.Cease()
  249. svr := TheServer()
  250. // Prepare:
  251. // Test:
  252. // Isn't it stopped?
  253. if vpnProc.Status() != supervisor.STOPPED {
  254. t.Fatalf("expected state is STOPPED, got %s instead", vpnProc.Status())
  255. }
  256. // Call start without server initialization.
  257. svr.StartVPNProc()
  258. // Isn't it still stopped?
  259. if vpnProc.Status() != supervisor.STOPPED {
  260. t.Fatalf("expected state is STOPPED, got %s instead", vpnProc.Status())
  261. }
  262. // Initialize OVPM server.
  263. svr.Init("localhost", "", UDPProto, "", "")
  264. // Call start again..
  265. svr.StartVPNProc()
  266. // Isn't it RUNNING?
  267. if vpnProc.Status() != supervisor.RUNNING {
  268. t.Fatalf("expected state is RUNNING, got %s instead", vpnProc.Status())
  269. }
  270. }
  271. func TestVPNStopVPNProc(t *testing.T) {
  272. // Init:
  273. setupTestCase()
  274. CreateDB("sqlite3", ":memory:")
  275. defer db.Cease()
  276. svr := TheServer()
  277. svr.Init("localhost", "", UDPProto, "", "")
  278. // Prepare:
  279. vpnProc.Start()
  280. // Test:
  281. // Isn't it running?
  282. if vpnProc.Status() != supervisor.RUNNING {
  283. t.Fatalf("expected state is RUNNING, got %s instead", vpnProc.Status())
  284. }
  285. // Call stop.
  286. svr.StopVPNProc()
  287. // Isn't it stopped?
  288. if vpnProc.Status() != supervisor.STOPPED {
  289. t.Fatalf("expected state is STOPPED, got %s instead", vpnProc.Status())
  290. }
  291. }
  292. func TestVPNRestartVPNProc(t *testing.T) {
  293. // Init:
  294. CreateDB("sqlite3", ":memory:")
  295. defer db.Cease()
  296. svr := TheServer()
  297. svr.Init("localhost", "", UDPProto, "", "")
  298. // Prepare:
  299. // Test:
  300. // Call restart.
  301. svr.RestartVPNProc()
  302. // Isn't it running?
  303. if vpnProc.Status() != supervisor.RUNNING {
  304. t.Fatalf("expected state is RUNNING, got %s instead", vpnProc.Status())
  305. }
  306. // Call restart again.
  307. svr.RestartVPNProc()
  308. // Isn't it running?
  309. if vpnProc.Status() != supervisor.RUNNING {
  310. t.Fatalf("expected state is RUNNING, got %s instead", vpnProc.Status())
  311. }
  312. }
  313. func TestVPNEmit(t *testing.T) {
  314. // Init:
  315. setupTestCase()
  316. CreateDB("sqlite3", ":memory:")
  317. defer db.Cease()
  318. svr := TheServer()
  319. svr.Init("localhost", "", UDPProto, "", "")
  320. // Prepare:
  321. // Test:
  322. svr.Emit()
  323. var emittests = []string{
  324. _DefaultVPNConfPath,
  325. _DefaultKeyPath,
  326. _DefaultCertPath,
  327. _DefaultCRLPath,
  328. _DefaultCACertPath,
  329. _DefaultCAKeyPath,
  330. _DefaultDHParamsPath,
  331. }
  332. for _, tt := range emittests {
  333. if len(fs[tt]) == 0 {
  334. t.Errorf("%s is expected to be not empty but it is", tt)
  335. }
  336. }
  337. // TODO(cad): Write test cases for ccd/ files as well.
  338. }
  339. func TestVPNemitToFile(t *testing.T) {
  340. // Initialize:
  341. // Prepare:
  342. path := "/test/file"
  343. content := "blah blah blah"
  344. // Test:
  345. // Is path exist?
  346. if _, ok := fs[path]; ok {
  347. t.Fatalf("key '%s' expected to be non-existent on fs, but it is instead", path)
  348. }
  349. // Emit the contents.
  350. if err := TheServer().emitToFile(path, content, 0); err != nil {
  351. t.Fatalf("expected to be able to emit to the filesystem but we got this error instead: %v", err)
  352. }
  353. // Is the content on the filesystem correct?
  354. if fs[path] != content {
  355. t.Fatalf("content on the filesytem is expected to be same with '%s' but it's '%s' instead", content, fs[path])
  356. }
  357. }
  358. type fakeProcess struct {
  359. state supervisor.State
  360. }
  361. func (f *fakeProcess) Start() {
  362. f.state = supervisor.RUNNING
  363. }
  364. func (f *fakeProcess) Stop() {
  365. f.state = supervisor.STOPPED
  366. }
  367. func (f *fakeProcess) Restart() {
  368. f.state = supervisor.RUNNING
  369. }
  370. func (f *fakeProcess) Status() supervisor.State {
  371. return f.state
  372. }
  373. func TestGetConnectedUsers(t *testing.T) {
  374. // Init:
  375. setupTestCase()
  376. CreateDB("sqlite3", ":memory:")
  377. defer db.Cease()
  378. svr := TheServer()
  379. svr.Init("localhost", "", UDPProto, "", "")
  380. // Mock funcs.
  381. svr.openFunc = func(path string) (io.Reader, error) {
  382. return nil, nil
  383. }
  384. // Create the corresponding users for test.
  385. usr1, err := CreateNewUser("usr1", "1234", true, 0, false)
  386. if err != nil {
  387. t.Fatalf("user creation failed: %v", err)
  388. }
  389. usr2, err := CreateNewUser("usr2", "1234", true, 0, false)
  390. if err != nil {
  391. t.Fatalf("user creation failed: %v", err)
  392. }
  393. now := time.Now()
  394. svr.parseStatusLogFunc = func(f io.Reader) ([]clEntry, []rtEntry) {
  395. clt := []clEntry{
  396. clEntry{
  397. CommonName: usr1.GetUsername(),
  398. RealAddress: "1.1.1.1",
  399. ConnectedSince: now,
  400. BytesReceived: 1,
  401. BytesSent: 5,
  402. },
  403. clEntry{
  404. CommonName: usr2.GetUsername(),
  405. RealAddress: "1.1.1.2",
  406. ConnectedSince: now,
  407. BytesReceived: 2,
  408. BytesSent: 6,
  409. },
  410. }
  411. rtt := []rtEntry{
  412. rtEntry{
  413. CommonName: usr1.GetUsername(),
  414. RealAddress: "1.1.1.1",
  415. LastRef: now,
  416. VirtualAddress: "10.10.10.1",
  417. },
  418. rtEntry{
  419. CommonName: usr2.GetUsername(),
  420. RealAddress: "1.1.1.2",
  421. LastRef: now,
  422. VirtualAddress: "10.10.10.2",
  423. },
  424. }
  425. return clt, rtt
  426. }
  427. // Test:
  428. tests := []struct {
  429. name string
  430. want []User
  431. wantErr bool
  432. }{
  433. {"default", []User{*usr2, *usr1}, false},
  434. }
  435. for _, tt := range tests {
  436. t.Run(tt.name, func(t *testing.T) {
  437. got, err := TheServer().GetConnectedUsers()
  438. if (err != nil) != tt.wantErr {
  439. t.Errorf("GetConnectedUsers() error = %v, wantErr %v", err, tt.wantErr)
  440. return
  441. }
  442. for _, wu := range tt.want {
  443. var found bool
  444. for _, u := range got {
  445. if wu.GetUsername() == u.GetUsername() {
  446. found = true
  447. }
  448. }
  449. if !found {
  450. t.Errorf("wanted user (%s) is not present in the response we got %v", wu.GetUsername(), got)
  451. }
  452. }
  453. })
  454. }
  455. }
  456. func init() {
  457. // Init
  458. Testing = true
  459. fs = make(map[string]string)
  460. CreateDB("sqlite3", ":memory:")
  461. defer db.Cease()
  462. // Monkeypatch emitToFile()
  463. TheServer().emitToFileFunc = func(path, content string, mode uint) error {
  464. fs[path] = content
  465. return nil
  466. }
  467. vpnProc = &fakeProcess{state: supervisor.STOPPED}
  468. }