From b9c3e6475033dbefcaf939e3cd93e7be68d41b30 Mon Sep 17 00:00:00 2001 From: Andy Wang Date: Fri, 24 Apr 2020 01:06:35 +0100 Subject: [PATCH] Add tests --- internal/server/activeuser_test.go | 10 +-- internal/server/userpanel_test.go | 139 +++++++++++++++++++++++++++-- 2 files changed, 137 insertions(+), 12 deletions(-) diff --git a/internal/server/activeuser_test.go b/internal/server/activeuser_test.go index 996cb56..e6aeab4 100644 --- a/internal/server/activeuser_test.go +++ b/internal/server/activeuser_test.go @@ -6,6 +6,7 @@ import ( "github.com/cbeuw/Cloak/internal/common" mux "github.com/cbeuw/Cloak/internal/multiplex" "github.com/cbeuw/Cloak/internal/server/usermanager" + "io/ioutil" "os" "testing" ) @@ -24,7 +25,10 @@ func getSeshConfig(unordered bool) mux.SessionConfig { } func TestActiveUser_Bypass(t *testing.T) { - manager, err := usermanager.MakeLocalManager(MOCK_DB_NAME, common.RealWorldState) + var tmpDB, _ = ioutil.TempFile("", "ck_user_info") + defer os.Remove(tmpDB.Name()) + + manager, err := usermanager.MakeLocalManager(tmpDB.Name(), common.RealWorldState) if err != nil { t.Fatal("failed to make local manager", err) } @@ -115,8 +119,4 @@ func TestActiveUser_Bypass(t *testing.T) { if err != nil { t.Fatal("failed to close localmanager", err) } - err = os.Remove(MOCK_DB_NAME) - if err != nil { - t.Fatal("failed to delete mockdb", err) - } } diff --git a/internal/server/userpanel_test.go b/internal/server/userpanel_test.go index cad0283..f74d3e9 100644 --- a/internal/server/userpanel_test.go +++ b/internal/server/userpanel_test.go @@ -4,14 +4,17 @@ import ( "encoding/base64" "github.com/cbeuw/Cloak/internal/common" "github.com/cbeuw/Cloak/internal/server/usermanager" + "io/ioutil" "os" "testing" + "time" ) -const MOCK_DB_NAME = "userpanel_test_mock_database.db" - func TestUserPanel_BypassUser(t *testing.T) { - manager, err := usermanager.MakeLocalManager(MOCK_DB_NAME, common.RealWorldState) + var tmpDB, _ = ioutil.TempFile("", "ck_user_info") + defer os.Remove(tmpDB.Name()) + + manager, err := usermanager.MakeLocalManager(tmpDB.Name(), common.RealWorldState) if err != nil { t.Error("failed to make local manager", err) } @@ -57,8 +60,130 @@ func TestUserPanel_BypassUser(t *testing.T) { if err != nil { t.Error("failed to close localmanager", err) } - err = os.Remove(MOCK_DB_NAME) - if err != nil { - t.Error("failed to delete mockdb", err) - } +} + +var mockUID = []byte{0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15} +var mockWorldState = common.WorldOfTime(time.Unix(1, 0)) +var validUserInfo = usermanager.UserInfo{ + UID: mockUID, + SessionsCap: 10, + UpRate: 100, + DownRate: 1000, + UpCredit: 10000, + DownCredit: 100000, + ExpiryTime: 1000000, +} + +func TestUserPanel_GetUser(t *testing.T) { + var tmpDB, _ = ioutil.TempFile("", "ck_user_info") + defer os.Remove(tmpDB.Name()) + mgr, err := usermanager.MakeLocalManager(tmpDB.Name(), mockWorldState) + if err != nil { + t.Fatal(err) + } + panel := MakeUserPanel(mgr) + + t.Run("normal user", func(t *testing.T) { + _ = mgr.WriteUserInfo(validUserInfo) + + activeUser, err := panel.GetUser(validUserInfo.UID) + if err != nil { + t.Error(err) + } + + again, err := panel.GetUser(validUserInfo.UID) + if err != nil { + t.Errorf("can't get existing user: %v", err) + } + + if activeUser != again { + t.Error("got different references") + } + }) + t.Run("non existent user", func(t *testing.T) { + _, err = panel.GetUser(make([]byte, 16)) + if err != usermanager.ErrUserNotFound { + t.Errorf("expecting error %v, got %v", usermanager.ErrUserNotFound, err) + } + }) +} + +func TestUserPanel_UpdateUsageQueue(t *testing.T) { + var tmpDB, _ = ioutil.TempFile("", "ck_user_info") + defer os.Remove(tmpDB.Name()) + mgr, err := usermanager.MakeLocalManager(tmpDB.Name(), mockWorldState) + if err != nil { + t.Fatal(err) + } + panel := MakeUserPanel(mgr) + + t.Run("normal update", func(t *testing.T) { + _ = mgr.WriteUserInfo(validUserInfo) + + user, err := panel.GetUser(validUserInfo.UID) + if err != nil { + t.Error(err) + } + + user.valve.AddTx(1) + user.valve.AddRx(2) + panel.updateUsageQueue() + err = panel.commitUpdate() + if err != nil { + t.Error(err) + } + + if user.valve.GetRx() != 0 || user.valve.GetTx() != 0 { + t.Error("rx and tx stats are not cleared") + } + + updatedUinfo, _ := mgr.GetUserInfo(validUserInfo.UID) + if updatedUinfo.DownCredit != validUserInfo.DownCredit-1 { + t.Error("down credit incorrect update") + } + if updatedUinfo.UpCredit != validUserInfo.UpCredit-2 { + t.Error("up credit incorrect update") + } + + // another update + user.valve.AddTx(3) + user.valve.AddRx(4) + panel.updateUsageQueue() + err = panel.commitUpdate() + if err != nil { + t.Error(err) + } + + updatedUinfo, _ = mgr.GetUserInfo(validUserInfo.UID) + if updatedUinfo.DownCredit != validUserInfo.DownCredit-(1+3) { + t.Error("down credit incorrect update") + } + if updatedUinfo.UpCredit != validUserInfo.UpCredit-(2+4) { + t.Error("up credit incorrect update") + } + }) + t.Run("terminating update", func(t *testing.T) { + _ = mgr.WriteUserInfo(validUserInfo) + + user, err := panel.GetUser(validUserInfo.UID) + if err != nil { + t.Error(err) + } + + user.valve.AddTx(validUserInfo.DownCredit + 100) + panel.updateUsageQueue() + err = panel.commitUpdate() + if err != nil { + t.Error(err) + } + + if panel.isActive(validUserInfo.UID) { + t.Error("user not terminated") + } + + updatedUinfo, _ := mgr.GetUserInfo(validUserInfo.UID) + if updatedUinfo.DownCredit != -100 { + t.Error("down credit not updated correctly after the user has been terminated") + } + }) }