| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455 |
- package ovpm
- import (
- "strings"
- "testing"
- "github.com/Sirupsen/logrus"
- "github.com/bouk/monkey"
- "github.com/cad/ovpm/supervisor"
- )
- var fs map[string]string
- func setupTestCase() {
- // Initialize.
- fs = make(map[string]string)
- vpnProc.Stop()
- }
- func TestVPNInit(t *testing.T) {
- // Init:
- setupTestCase()
- SetupDB("sqlite3", ":memory:")
- defer CeaseDB()
- // Prepare:
- // Test:
- // Check database if the database has no server.
- var server DBServer
- db.First(&server)
- // Isn't server empty struct?
- if !db.NewRecord(&server) {
- t.Fatalf("server is expected to be empty struct(new record) but it isn't %+v", server)
- }
- // Wrongfully initialize server.
- err := Init("localhost", "asdf")
- if err == nil {
- t.Fatalf("error is expected to be not nil but it's nil instead")
- }
- // Initialize the server.
- Init("localhost", "")
- // Check database if the database has no server.
- var server2 DBServer
- db.First(&server2)
- // Is server empty struct?
- if db.NewRecord(&server2) {
- t.Fatalf("server is expected to be not empty struct(new record) but it is %+v", server2)
- }
- }
- func TestVPNDeinit(t *testing.T) {
- // Init:
- setupTestCase()
- SetupDB("sqlite3", ":memory:")
- defer CeaseDB()
- // Prepare:
- // Initialize the server.
- Init("localhost", "")
- u, err := CreateNewUser("user", "p", false, 0)
- if err != nil {
- t.Fatal(err)
- }
- u.Delete()
- // Test:
- var server DBServer
- db.First(&server)
- // Isn't server empty struct?
- if db.NewRecord(&server) {
- t.Fatalf("server is expected to be not empty struct(new record) but it is %+v", server)
- }
- // Test if Revoked table contains the removed user's entries.
- var revoked DBRevoked
- db.First(&revoked)
- if db.NewRecord(&revoked) {
- t.Errorf("revoked shouldn't be empty")
- }
- // Deinitialize.
- Deinit()
- // Get server from db.
- var server2 DBServer
- db.First(&server2)
- // Isn't server empty struct?
- if !db.NewRecord(&server2) {
- t.Fatalf("server is expected to be empty struct(new record) but it is not %+v", server2)
- }
- // Test if Revoked table contains the removed user's entries.
- var revoked2 DBRevoked
- db.First(&revoked2)
- // Is revoked empty?
- if !db.NewRecord(&revoked2) {
- t.Errorf("revoked should be empty")
- }
- }
- func TestVPNIsInitialized(t *testing.T) {
- // Init:
- setupTestCase()
- SetupDB("sqlite3", ":memory:")
- defer CeaseDB()
- // Prepare:
- // Test:
- // Is initialized?
- if IsInitialized() {
- t.Fatalf("IsInitialized() is expected to return false but it returned true")
- }
- // Initialize the server.
- Init("localhost", "")
- // Isn't initialized?
- if !IsInitialized() {
- t.Fatalf("IsInitialized() is expected to return true but it returned false")
- }
- }
- func TestVPNGetServerInstance(t *testing.T) {
- // Init:
- setupTestCase()
- SetupDB("sqlite3", ":memory:")
- defer CeaseDB()
- // Prepare:
- // Test:
- server, err := GetServerInstance()
- // Is it nil?
- if err == nil {
- t.Fatalf("GetServerInstance() is expected to give error since server is not initialized yet, but it gave no error instead")
- }
- // Isn't server nil?
- if server != nil {
- t.Fatal("server is expected to be nil but it's not")
- }
- // Initialize server.
- Init("localhost", "")
- server, err = GetServerInstance()
- // Isn't it nil?
- if err != nil {
- t.Fatalf("GetServerInstance() is expected to give no error since server is initialized yet, but it gave error instead")
- }
- // Is server nil?
- if server == nil {
- t.Fatal("server is expected to be not nil but it is")
- }
- }
- func TestVPNDumpsClientConfig(t *testing.T) {
- // Init:
- setupTestCase()
- SetupDB("sqlite3", ":memory:")
- defer CeaseDB()
- Init("localhost", "")
- // Prepare:
- user, _ := CreateNewUser("user", "password", false, 0)
- // Test:
- clientConfigBlob, err := DumpsClientConfig(user.GetUsername())
- if err != nil {
- t.Fatalf("expected to dump client config but we got error instead: %v", err)
- }
- // Is empty?
- if len(clientConfigBlob) == 0 {
- t.Fatal("expected the dump not empty but it's empty instead")
- }
- }
- func TestVPNDumpClientConfig(t *testing.T) {
- // Init:
- setupTestCase()
- SetupDB("sqlite3", ":memory:")
- defer CeaseDB()
- Init("localhost", "")
- // Prepare:
- noGW := false
- user, err := CreateNewUser("user", "password", noGW, 0)
- if err != nil {
- t.Fatalf("can not create user: %v", err)
- }
- // Test:
- err = DumpClientConfig(user.GetUsername(), "/tmp/user.ovpn")
- if err != nil {
- t.Fatalf("expected to dump client config but we got error instead: %v", err)
- }
- // Read file.
- clientConfigBlob := fs["/tmp/user.ovpn"]
- // Is empty?
- if len(clientConfigBlob) == 0 {
- t.Fatal("expected the dump not empty but it's empty instead")
- }
- // Is noGW honored?
- if strings.Contains(clientConfigBlob, "route-nopull") != noGW {
- logrus.Info(clientConfigBlob)
- t.Fatalf("client config generator doesn't honor NoGW")
- }
- user.Delete()
- noGW = true
- user, err = CreateNewUser("user", "password", noGW, 0)
- if err != nil {
- t.Fatalf("can not create user: %v", err)
- }
- err = DumpClientConfig(user.GetUsername(), "/tmp/user.ovpn")
- if err != nil {
- t.Fatalf("expected to dump client config but we got error instead: %v", err)
- }
- // Read file.
- clientConfigBlob = fs["/tmp/user.ovpn"]
- // Is noGW honored?
- if strings.Contains(clientConfigBlob, "route-nopull") != noGW {
- logrus.Info(clientConfigBlob)
- t.Fatalf("client config generator doesn't honor NoGW")
- }
- }
- func TestVPNGetSystemCA(t *testing.T) {
- // Init:
- setupTestCase()
- SetupDB("sqlite3", ":memory:")
- defer CeaseDB()
- // Prepare:
- // Test:
- ca, err := GetSystemCA()
- if err == nil {
- t.Fatalf("GetSystemCA() is expected to give error but it didn't instead")
- }
- // Initialize system.
- Init("localhost", "")
- ca, err = GetSystemCA()
- if err != nil {
- t.Fatalf("GetSystemCA() is expected to get system ca, but it gave us an error instead: %v", err)
- }
- // Is it empty?
- if len(ca.Cert) == 0 {
- t.Fatalf("ca.Cert is expected to be not empty, but it's empty instead")
- }
- if len(ca.Key) == 0 {
- t.Fatalf("ca.Key is expected to be not empty, but it's empty instead")
- }
- }
- func TestVPNStartVPNProc(t *testing.T) {
- // Init:
- setupTestCase()
- SetupDB("sqlite3", ":memory:")
- defer CeaseDB()
- // Prepare:
- // Test:
- // Isn't it stopped?
- if vpnProc.Status() != supervisor.STOPPED {
- t.Fatalf("expected state is STOPPED, got %s instead", vpnProc.Status())
- }
- // Call start without server initialization.
- StartVPNProc()
- // Isn't it still stopped?
- if vpnProc.Status() != supervisor.STOPPED {
- t.Fatalf("expected state is STOPPED, got %s instead", vpnProc.Status())
- }
- // Initialize OVPM server.
- Init("localhost", "")
- // Call start again..
- StartVPNProc()
- // Isn't it RUNNING?
- if vpnProc.Status() != supervisor.RUNNING {
- t.Fatalf("expected state is RUNNING, got %s instead", vpnProc.Status())
- }
- }
- func TestVPNStopVPNProc(t *testing.T) {
- // Init:
- setupTestCase()
- SetupDB("sqlite3", ":memory:")
- defer CeaseDB()
- Init("localhost", "")
- // Prepare:
- vpnProc.Start()
- // Test:
- // Isn't it running?
- if vpnProc.Status() != supervisor.RUNNING {
- t.Fatalf("expected state is RUNNING, got %s instead", vpnProc.Status())
- }
- // Call stop.
- StopVPNProc()
- // Isn't it stopped?
- if vpnProc.Status() != supervisor.STOPPED {
- t.Fatalf("expected state is STOPPED, got %s instead", vpnProc.Status())
- }
- }
- func TestVPNRestartVPNProc(t *testing.T) {
- // Init:
- SetupDB("sqlite3", ":memory:")
- defer CeaseDB()
- Init("localhost", "")
- // Prepare:
- // Test:
- // Call restart.
- RestartVPNProc()
- // Isn't it running?
- if vpnProc.Status() != supervisor.RUNNING {
- t.Fatalf("expected state is RUNNING, got %s instead", vpnProc.Status())
- }
- // Call restart again.
- RestartVPNProc()
- // Isn't it running?
- if vpnProc.Status() != supervisor.RUNNING {
- t.Fatalf("expected state is RUNNING, got %s instead", vpnProc.Status())
- }
- }
- func TestVPNEmit(t *testing.T) {
- // Init:
- setupTestCase()
- SetupDB("sqlite3", ":memory:")
- defer CeaseDB()
- Init("localhost", "")
- // Prepare:
- // Test:
- Emit()
- var emittests = []string{
- _DefaultVPNConfPath,
- _DefaultKeyPath,
- _DefaultCertPath,
- _DefaultCRLPath,
- _DefaultCACertPath,
- _DefaultCAKeyPath,
- _DefaultDHParamsPath,
- }
- for _, tt := range emittests {
- if len(fs[tt]) == 0 {
- t.Errorf("%s is expected to be not empty but it is", tt)
- }
- }
- // TODO(cad): Write test cases for ccd/ files as well.
- }
- func TestVPNemitToFile(t *testing.T) {
- // Initialize:
- // Prepare:
- path := "/test/file"
- content := "blah blah blah"
- // Test:
- // Is path exist?
- if _, ok := fs[path]; ok {
- t.Fatalf("key '%s' expected to be non-existent on fs, but it is instead", path)
- }
- // Emit the contents.
- err := emitToFile(path, content, 0)
- if err != nil {
- t.Fatalf("expected to be able to emit to the filesystem but we got this error instead: %v", err)
- }
- // Is the content on the filesystem correct?
- if fs[path] != content {
- t.Fatalf("content on the filesytem is expected to be same with '%s' but it's '%s' instead", content, fs[path])
- }
- }
- type fakeProcess struct {
- state supervisor.State
- }
- func (f *fakeProcess) Start() {
- f.state = supervisor.RUNNING
- }
- func (f *fakeProcess) Stop() {
- f.state = supervisor.STOPPED
- }
- func (f *fakeProcess) Restart() {
- f.state = supervisor.RUNNING
- }
- func (f *fakeProcess) Status() supervisor.State {
- return f.state
- }
- func init() {
- // Init
- Testing = true
- fs = make(map[string]string)
- // Monkeypatch emitToFile()
- monkey.Patch(emitToFile, func(path, content string, mode uint) error {
- fs[path] = content
- return nil
- })
- vpnProc = &fakeProcess{state: supervisor.STOPPED}
- }
|