vpn_test.go 7.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386
  1. package ovpm
  2. import (
  3. "testing"
  4. "github.com/bouk/monkey"
  5. "github.com/cad/ovpm/supervisor"
  6. )
  7. var fs map[string]string
  8. func TestVPNInit(t *testing.T) {
  9. // Init:
  10. Testing = true
  11. SetupDB("sqlite3", ":memory:")
  12. defer CeaseDB()
  13. // Prepare:
  14. // Test:
  15. // Check database if the database has no server.
  16. var server DBServer
  17. db.First(&server)
  18. // Isn't server empty struct?
  19. if !db.NewRecord(&server) {
  20. t.Fatalf("server is expected to be empty struct(new record) but it isn't %+v", server)
  21. }
  22. // Initialize the server.
  23. Init("localhost", "")
  24. // Check database if the database has no server.
  25. var server2 DBServer
  26. db.First(&server2)
  27. // Is server empty struct?
  28. if db.NewRecord(&server2) {
  29. t.Fatalf("server is expected to be not empty struct(new record) but it is %+v", server2)
  30. }
  31. }
  32. func TestVPNDeinit(t *testing.T) {
  33. // Init:
  34. Testing = true
  35. SetupDB("sqlite3", ":memory:")
  36. defer CeaseDB()
  37. // Prepare:
  38. // Initialize the server.
  39. Init("localhost", "")
  40. u, _ := CreateNewUser("user", "p")
  41. u.Delete()
  42. // Test:
  43. var server DBServer
  44. db.First(&server)
  45. // Isn't server empty struct?
  46. if db.NewRecord(&server) {
  47. t.Fatalf("server is expected to be not empty struct(new record) but it is %+v", server)
  48. }
  49. // Test if Revoked table contains the removed user's entries.
  50. var revoked DBRevoked
  51. db.First(&revoked)
  52. if db.NewRecord(&revoked) {
  53. t.Errorf("revoked shouldn't be empty")
  54. }
  55. // Deinitialize.
  56. Deinit()
  57. // Get server from db.
  58. var server2 DBServer
  59. db.First(&server2)
  60. // Isn't server empty struct?
  61. if !db.NewRecord(&server2) {
  62. t.Fatalf("server is expected to be empty struct(new record) but it is not %+v", server2)
  63. }
  64. // Test if Revoked table contains the removed user's entries.
  65. var revoked2 DBRevoked
  66. db.First(&revoked2)
  67. // Is revoked empty?
  68. if !db.NewRecord(&revoked2) {
  69. t.Errorf("revoked should be empty")
  70. }
  71. }
  72. func TestVPNIsInitialized(t *testing.T) {
  73. // Init:
  74. Testing = true
  75. SetupDB("sqlite3", ":memory:")
  76. defer CeaseDB()
  77. // Prepare:
  78. // Test:
  79. // Is initialized?
  80. if IsInitialized() {
  81. t.Fatalf("IsInitialized() is expected to return false but it returned true")
  82. }
  83. // Initialize the server.
  84. Init("localhost", "")
  85. // Isn't initialized?
  86. if !IsInitialized() {
  87. t.Fatalf("IsInitialized() is expected to return true but it returned false")
  88. }
  89. }
  90. func TestVPNGetServerInstance(t *testing.T) {
  91. // Init:
  92. Testing = true
  93. SetupDB("sqlite3", ":memory:")
  94. defer CeaseDB()
  95. // Prepare:
  96. // Test:
  97. server, err := GetServerInstance()
  98. // Is it nil?
  99. if err == nil {
  100. t.Fatalf("GetServerInstance() is expected to give error since server is not initialized yet, but it gave no error instead")
  101. }
  102. // Isn't server nil?
  103. if server != nil {
  104. t.Fatal("server is expected to be nil but it's not")
  105. }
  106. // Initialize server.
  107. Init("localhost", "")
  108. server, err = GetServerInstance()
  109. // Isn't it nil?
  110. if err != nil {
  111. t.Fatalf("GetServerInstance() is expected to give no error since server is initialized yet, but it gave error instead")
  112. }
  113. // Is server nil?
  114. if server == nil {
  115. t.Fatal("server is expected to be not nil but it is")
  116. }
  117. }
  118. func TestVPNDumpsClientConfig(t *testing.T) {
  119. // Init:
  120. Testing = true
  121. SetupDB("sqlite3", ":memory:")
  122. defer CeaseDB()
  123. Init("localhost", "")
  124. // Prepare:
  125. user, _ := CreateNewUser("user", "password")
  126. // Test:
  127. clientConfigBlob, err := DumpsClientConfig(user.GetUsername())
  128. if err != nil {
  129. t.Fatalf("expected to dump client config but we got error instead: %v", err)
  130. }
  131. // Is empty?
  132. if len(clientConfigBlob) == 0 {
  133. t.Fatal("expected the dump not empty but it's empty instead")
  134. }
  135. }
  136. func TestVPNDumpClientConfig(t *testing.T) {
  137. // Init:
  138. Testing = true
  139. SetupDB("sqlite3", ":memory:")
  140. defer CeaseDB()
  141. Init("localhost", "")
  142. // Prepare:
  143. user, _ := CreateNewUser("user", "password")
  144. // Test:
  145. err := DumpClientConfig(user.GetUsername(), "/tmp/user.ovpn")
  146. if err != nil {
  147. t.Fatalf("expected to dump client config but we got error instead: %v", err)
  148. }
  149. // Read file.
  150. clientConfigBlob := fs["/tmp/user.ovpn"]
  151. // Is empty?
  152. if len(clientConfigBlob) == 0 {
  153. t.Fatal("expected the dump not empty but it's empty instead")
  154. }
  155. }
  156. func TestVPNGetSystemCA(t *testing.T) {
  157. // Init:
  158. Testing = true
  159. SetupDB("sqlite3", ":memory:")
  160. defer CeaseDB()
  161. // Prepare:
  162. // Test:
  163. ca, err := GetSystemCA()
  164. if err == nil {
  165. t.Fatalf("GetSystemCA() is expected to give error but it didn't instead")
  166. }
  167. // Initialize system.
  168. Init("localhost", "")
  169. ca, err = GetSystemCA()
  170. if err != nil {
  171. t.Fatalf("GetSystemCA() is expected to get system ca, but it gave us an error instead: %v", err)
  172. }
  173. // Is it empty?
  174. if len(ca.Cert) == 0 {
  175. t.Fatalf("ca.Cert is expected to be not empty, but it's empty instead")
  176. }
  177. if len(ca.Key) == 0 {
  178. t.Fatalf("ca.Key is expected to be not empty, but it's empty instead")
  179. }
  180. }
  181. func TestVPNStartVPNProc(t *testing.T) {
  182. // Init:
  183. Testing = true
  184. SetupDB("sqlite3", ":memory:")
  185. defer CeaseDB()
  186. // Prepare:
  187. // Test:
  188. // Isn't it stopped?
  189. if vpnProc.Status() != supervisor.STOPPED {
  190. t.Fatalf("expected state is STOPPED, got %s instead", vpnProc.Status())
  191. }
  192. // Call start without server initialization.
  193. StartVPNProc()
  194. // Isn't it still stopped?
  195. if vpnProc.Status() != supervisor.STOPPED {
  196. t.Fatalf("expected state is STOPPED, got %s instead", vpnProc.Status())
  197. }
  198. // Initialize OVPM server.
  199. Init("localhost", "")
  200. // Call start again..
  201. StartVPNProc()
  202. // Isn't it RUNNING?
  203. if vpnProc.Status() != supervisor.RUNNING {
  204. t.Fatalf("expected state is RUNNING, got %s instead", vpnProc.Status())
  205. }
  206. }
  207. func TestVPNStopVPNProc(t *testing.T) {
  208. // Init:
  209. Testing = true
  210. SetupDB("sqlite3", ":memory:")
  211. defer CeaseDB()
  212. Init("localhost", "")
  213. // Prepare:
  214. vpnProc.Start()
  215. // Test:
  216. // Isn't it running?
  217. if vpnProc.Status() != supervisor.RUNNING {
  218. t.Fatalf("expected state is RUNNING, got %s instead", vpnProc.Status())
  219. }
  220. // Call stop.
  221. StopVPNProc()
  222. // Isn't it stopped?
  223. if vpnProc.Status() != supervisor.STOPPED {
  224. t.Fatalf("expected state is STOPPED, got %s instead", vpnProc.Status())
  225. }
  226. }
  227. func TestVPNRestartVPNProc(t *testing.T) {
  228. // Init:
  229. Testing = true
  230. SetupDB("sqlite3", ":memory:")
  231. defer CeaseDB()
  232. Init("localhost", "")
  233. // Prepare:
  234. // Test:
  235. // Call restart.
  236. // Isn't it stopped?
  237. if vpnProc.Status() != supervisor.STOPPED {
  238. t.Fatalf("expected state is STOPPED, got %s instead", vpnProc.Status())
  239. }
  240. RestartVPNProc()
  241. // Isn't it running?
  242. if vpnProc.Status() != supervisor.RUNNING {
  243. t.Fatalf("expected state is RUNNING, got %s instead", vpnProc.Status())
  244. }
  245. // Call restart again.
  246. RestartVPNProc()
  247. // Isn't it running?
  248. if vpnProc.Status() != supervisor.RUNNING {
  249. t.Fatalf("expected state is RUNNING, got %s instead", vpnProc.Status())
  250. }
  251. }
  252. func TestVPNEmit(t *testing.T) {
  253. // Init:
  254. Testing = true
  255. SetupDB("sqlite3", ":memory:")
  256. defer CeaseDB()
  257. Init("localhost", "")
  258. // Prepare:
  259. // Test:
  260. Emit()
  261. var emittests = []string{
  262. _DefaultVPNConfPath,
  263. _DefaultKeyPath,
  264. _DefaultCertPath,
  265. _DefaultCRLPath,
  266. _DefaultCACertPath,
  267. _DefaultCAKeyPath,
  268. _DefaultDHParamsPath,
  269. }
  270. for _, tt := range emittests {
  271. if len(fs[tt]) == 0 {
  272. t.Errorf("%s is expected to be not empty but it is", tt)
  273. }
  274. }
  275. // TODO(cad): Write test cases for ccd/ files as well.
  276. }
  277. type fakeProcess struct {
  278. state supervisor.State
  279. }
  280. func (f *fakeProcess) Start() {
  281. f.state = supervisor.RUNNING
  282. }
  283. func (f *fakeProcess) Stop() {
  284. f.state = supervisor.STOPPED
  285. }
  286. func (f *fakeProcess) Restart() {
  287. f.state = supervisor.RUNNING
  288. }
  289. func (f *fakeProcess) Status() supervisor.State {
  290. return f.state
  291. }
  292. func init() {
  293. // Initialize.
  294. fs = make(map[string]string)
  295. // Monkeypatch emitToFile()
  296. monkey.Patch(emitToFile, func(path, content string, mode uint) error {
  297. fs[path] = content
  298. return nil
  299. })
  300. vpnProc = &fakeProcess{state: supervisor.STOPPED}
  301. }