vpn_test.go 14 KB

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