vpn_test.go 13 KB

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