vpn_test.go 14 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616
  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, err := CreateNewUser("user", "password", false, 0, true, "description")
  175. if err != nil {
  176. t.Fatal(err)
  177. }
  178. // Test:
  179. clientConfigBlob, err := svr.DumpsClientConfig(user.GetUsername())
  180. if err != nil {
  181. t.Fatalf("expected to dump client config but we got error instead: %v", err)
  182. }
  183. // Is empty?
  184. if len(clientConfigBlob) == 0 {
  185. t.Fatal("expected the dump not empty but it's empty instead")
  186. }
  187. }
  188. func TestVPNDumpClientConfig(t *testing.T) {
  189. // Init:
  190. setupTestCase()
  191. CreateDB("sqlite3", ":memory:")
  192. defer db.Cease()
  193. svr := TheServer()
  194. svr.Init("localhost", "", UDPProto, "", "", "", "", false)
  195. // Prepare:
  196. noGW := false
  197. user, err := CreateNewUser("user", "password", noGW, 0, true, "description")
  198. if err != nil {
  199. t.Fatalf("can not create user: %v", err)
  200. }
  201. // Test:
  202. if err = svr.DumpClientConfig(user.GetUsername(), "/tmp/user.ovpn"); err != nil {
  203. t.Fatalf("expected to dump client config but we got error instead: %v", err)
  204. }
  205. // Read file.
  206. clientConfigBlob := fs["/tmp/user.ovpn"]
  207. // Is empty?
  208. if len(clientConfigBlob) == 0 {
  209. t.Fatal("expected the dump not empty but it's empty instead")
  210. }
  211. // Is noGW honored?
  212. if strings.Contains(clientConfigBlob, "route-nopull") != noGW {
  213. logrus.Info(clientConfigBlob)
  214. t.Fatalf("client config generator doesn't honor NoGW")
  215. }
  216. user.Delete()
  217. noGW = true
  218. user, err = CreateNewUser("user", "password", noGW, 0, true, "description")
  219. if err != nil {
  220. t.Fatalf("can not create user: %v", err)
  221. }
  222. if err = TheServer().DumpClientConfig(user.GetUsername(), "/tmp/user.ovpn"); err != nil {
  223. t.Fatalf("expected to dump client config but we got error instead: %v", err)
  224. }
  225. // Read file.
  226. clientConfigBlob = fs["/tmp/user.ovpn"]
  227. }
  228. func TestVPNGetSystemCA(t *testing.T) {
  229. // Init:
  230. setupTestCase()
  231. CreateDB("sqlite3", ":memory:")
  232. defer db.Cease()
  233. // Prepare:
  234. svr := TheServer()
  235. // Test:
  236. ca, err := svr.GetSystemCA()
  237. if err == nil {
  238. t.Fatalf("GetSystemCA() is expected to give error but it didn't instead")
  239. }
  240. // Initialize system.
  241. svr.Init("localhost", "", UDPProto, "", "", "", "", false)
  242. ca, err = svr.GetSystemCA()
  243. if err != nil {
  244. t.Fatalf("GetSystemCA() is expected to get system ca, but it gave us an error instead: %v", err)
  245. }
  246. // Is it empty?
  247. if len(ca.Cert) == 0 {
  248. t.Fatalf("ca.Cert is expected to be not empty, but it's empty instead")
  249. }
  250. if len(ca.Key) == 0 {
  251. t.Fatalf("ca.Key is expected to be not empty, but it's empty instead")
  252. }
  253. }
  254. func TestVPNStartVPNProc(t *testing.T) {
  255. // Init:
  256. setupTestCase()
  257. CreateDB("sqlite3", ":memory:")
  258. defer db.Cease()
  259. svr := TheServer()
  260. // Prepare:
  261. // Test:
  262. // Isn't it stopped?
  263. if vpnProc.Status() != supervisor.STOPPED {
  264. t.Fatalf("expected state is STOPPED, got %s instead", vpnProc.Status())
  265. }
  266. // Call start without server initialization.
  267. svr.StartVPNProc()
  268. // Isn't it still stopped?
  269. if vpnProc.Status() != supervisor.STOPPED {
  270. t.Fatalf("expected state is STOPPED, got %s instead", vpnProc.Status())
  271. }
  272. // Initialize OVPM server.
  273. svr.Init("localhost", "", UDPProto, "", "", "", "", false)
  274. // Call start again..
  275. svr.StartVPNProc()
  276. // Isn't it RUNNING?
  277. if vpnProc.Status() != supervisor.RUNNING {
  278. t.Fatalf("expected state is RUNNING, got %s instead", vpnProc.Status())
  279. }
  280. }
  281. func TestVPNStopVPNProc(t *testing.T) {
  282. // Init:
  283. setupTestCase()
  284. CreateDB("sqlite3", ":memory:")
  285. defer db.Cease()
  286. svr := TheServer()
  287. svr.Init("localhost", "", UDPProto, "", "", "", "", false)
  288. // Prepare:
  289. vpnProc.Start()
  290. // Test:
  291. // Isn't it running?
  292. if vpnProc.Status() != supervisor.RUNNING {
  293. t.Fatalf("expected state is RUNNING, got %s instead", vpnProc.Status())
  294. }
  295. // Call stop.
  296. svr.StopVPNProc()
  297. // Isn't it stopped?
  298. if vpnProc.Status() != supervisor.STOPPED {
  299. t.Fatalf("expected state is STOPPED, got %s instead", vpnProc.Status())
  300. }
  301. }
  302. func TestVPNRestartVPNProc(t *testing.T) {
  303. // Init:
  304. CreateDB("sqlite3", ":memory:")
  305. defer db.Cease()
  306. svr := TheServer()
  307. svr.Init("localhost", "", UDPProto, "", "", "", "", false)
  308. // Prepare:
  309. // Test:
  310. // Call restart.
  311. svr.RestartVPNProc()
  312. // Isn't it running?
  313. if vpnProc.Status() != supervisor.RUNNING {
  314. t.Fatalf("expected state is RUNNING, got %s instead", vpnProc.Status())
  315. }
  316. // Call restart again.
  317. svr.RestartVPNProc()
  318. // Isn't it running?
  319. if vpnProc.Status() != supervisor.RUNNING {
  320. t.Fatalf("expected state is RUNNING, got %s instead", vpnProc.Status())
  321. }
  322. }
  323. func TestVPNEmit(t *testing.T) {
  324. // Init:
  325. setupTestCase()
  326. CreateDB("sqlite3", ":memory:")
  327. defer db.Cease()
  328. svr := TheServer()
  329. svr.Init("localhost", "", UDPProto, "", "", "", "", false)
  330. // Prepare:
  331. // Test:
  332. svr.Emit()
  333. var emittests = []string{
  334. _DefaultVPNConfPath,
  335. _DefaultKeyPath,
  336. _DefaultCertPath,
  337. _DefaultCRLPath,
  338. _DefaultCACertPath,
  339. _DefaultCAKeyPath,
  340. _DefaultDHParamsPath,
  341. }
  342. for _, tt := range emittests {
  343. if len(fs[tt]) == 0 {
  344. t.Errorf("%s is expected to be not empty but it is", tt)
  345. }
  346. }
  347. // TODO(cad): Write test cases for ccd/ files as well.
  348. }
  349. func TestVPNemitToFile(t *testing.T) {
  350. // Initialize:
  351. // Prepare:
  352. path := "/test/file"
  353. content := "blah blah blah"
  354. // Test:
  355. // Is path exist?
  356. if _, ok := fs[path]; ok {
  357. t.Fatalf("key '%s' expected to be non-existent on fs, but it is instead", path)
  358. }
  359. // Emit the contents.
  360. if err := TheServer().emitToFile(path, content, 0); err != nil {
  361. t.Fatalf("expected to be able to emit to the filesystem but we got this error instead: %v", err)
  362. }
  363. // Is the content on the filesystem correct?
  364. if fs[path] != content {
  365. t.Fatalf("content on the filesytem is expected to be same with '%s' but it's '%s' instead", content, fs[path])
  366. }
  367. }
  368. type fakeProcess struct {
  369. state supervisor.State
  370. }
  371. func (f *fakeProcess) Start() {
  372. f.state = supervisor.RUNNING
  373. }
  374. func (f *fakeProcess) Stop() {
  375. f.state = supervisor.STOPPED
  376. }
  377. func (f *fakeProcess) Restart() {
  378. f.state = supervisor.RUNNING
  379. }
  380. func (f *fakeProcess) Status() supervisor.State {
  381. return f.state
  382. }
  383. func TestGetConnectedUsers(t *testing.T) {
  384. // Init:
  385. setupTestCase()
  386. CreateDB("sqlite3", ":memory:")
  387. defer db.Cease()
  388. svr := TheServer()
  389. svr.Init("localhost", "", UDPProto, "", "", "", "", false)
  390. // Mock funcs.
  391. svr.openFunc = func(path string) (io.Reader, error) {
  392. return nil, nil
  393. }
  394. // Create the corresponding users for test.
  395. usr1, err := CreateNewUser("usr1", "1234", true, 0, false, "description")
  396. if err != nil {
  397. t.Fatalf("user creation failed: %v", err)
  398. }
  399. usr2, err := CreateNewUser("usr2", "1234", true, 0, false, "description")
  400. if err != nil {
  401. t.Fatalf("user creation failed: %v", err)
  402. }
  403. now := time.Now()
  404. svr.parseStatusLogFunc = func(f io.Reader) ([]clEntry, []rtEntry) {
  405. clt := []clEntry{
  406. clEntry{
  407. CommonName: usr1.GetUsername(),
  408. RealAddress: "1.1.1.1",
  409. ConnectedSince: now,
  410. BytesReceived: 1,
  411. BytesSent: 5,
  412. },
  413. clEntry{
  414. CommonName: usr2.GetUsername(),
  415. RealAddress: "1.1.1.2",
  416. ConnectedSince: now,
  417. BytesReceived: 2,
  418. BytesSent: 6,
  419. },
  420. }
  421. rtt := []rtEntry{
  422. rtEntry{
  423. CommonName: usr1.GetUsername(),
  424. RealAddress: "1.1.1.1",
  425. LastRef: now,
  426. VirtualAddress: "10.10.10.1",
  427. },
  428. rtEntry{
  429. CommonName: usr2.GetUsername(),
  430. RealAddress: "1.1.1.2",
  431. LastRef: now,
  432. VirtualAddress: "10.10.10.2",
  433. },
  434. }
  435. return clt, rtt
  436. }
  437. // Test:
  438. tests := []struct {
  439. name string
  440. want []User
  441. wantErr bool
  442. }{
  443. {"default", []User{*usr2, *usr1}, false},
  444. }
  445. for _, tt := range tests {
  446. t.Run(tt.name, func(t *testing.T) {
  447. got, err := TheServer().GetConnectedUsers()
  448. if (err != nil) != tt.wantErr {
  449. t.Errorf("GetConnectedUsers() error = %v, wantErr %v", err, tt.wantErr)
  450. return
  451. }
  452. for _, wu := range tt.want {
  453. var found bool
  454. for _, u := range got {
  455. if wu.GetUsername() == u.GetUsername() {
  456. found = true
  457. }
  458. }
  459. if !found {
  460. t.Errorf("wanted user (%s) is not present in the response we got %v", wu.GetUsername(), got)
  461. }
  462. }
  463. })
  464. }
  465. }
  466. func TestVPN_ExpiresAt(t *testing.T) {
  467. // Initialize:
  468. db := CreateDB("sqlite3", ":memory:")
  469. defer db.Cease()
  470. svr := TheServer()
  471. svr.Init("localhost", "", UDPProto, "", "", "", "", false)
  472. // Test:
  473. cert, err := pki.ReadCertFromPEM(svr.Cert)
  474. if err != nil {
  475. t.Fatalf("test preperation failed: %v", err)
  476. }
  477. if !reflect.DeepEqual(svr.ExpiresAt(), cert.NotAfter) {
  478. t.Errorf("got (%s), want (%s)", svr.ExpiresAt(), cert.NotAfter)
  479. }
  480. }
  481. func TestVPN_CAExpiresAt(t *testing.T) {
  482. // Initialize:
  483. db := CreateDB("sqlite3", ":memory:")
  484. defer db.Cease()
  485. svr := TheServer()
  486. svr.Init("localhost", "", UDPProto, "", "", "", "", false)
  487. // Test:
  488. cert, err := pki.ReadCertFromPEM(svr.CACert)
  489. if err != nil {
  490. t.Fatalf("test preperation failed: %v", err)
  491. }
  492. if !reflect.DeepEqual(svr.CAExpiresAt(), cert.NotAfter) {
  493. t.Errorf("got (%s), want (%s)", svr.CAExpiresAt(), cert.NotAfter)
  494. }
  495. }
  496. func init() {
  497. // Init
  498. Testing = true
  499. fs = make(map[string]string)
  500. CreateDB("sqlite3", ":memory:")
  501. defer db.Cease()
  502. // Monkeypatch emitToFile()
  503. TheServer().emitToFileFunc = func(path, content string, mode uint) error {
  504. fs[path] = content
  505. return nil
  506. }
  507. vpnProc = &fakeProcess{state: supervisor.STOPPED}
  508. }