bitbucket.org/Aishee/synsec@v0.0.0-20210414005726-236fc01a153d/pkg/apiserver/apiserver_test.go (about) 1 package apiserver 2 3 import ( 4 "encoding/json" 5 "fmt" 6 "net/http" 7 "net/http/httptest" 8 "os" 9 "strings" 10 "testing" 11 12 middlewares "bitbucket.org/Aishee/synsec/pkg/apiserver/middlewares/v1" 13 "bitbucket.org/Aishee/synsec/pkg/cwversion" 14 "bitbucket.org/Aishee/synsec/pkg/models" 15 "github.com/go-openapi/strfmt" 16 17 "bitbucket.org/Aishee/synsec/pkg/csconfig" 18 "bitbucket.org/Aishee/synsec/pkg/database" 19 "github.com/gin-gonic/gin" 20 21 log "github.com/sirupsen/logrus" 22 "github.com/stretchr/testify/assert" 23 ) 24 25 var testMachineID = "test" 26 var testPassword = strfmt.Password("test") 27 var MachineTest = models.WatcherAuthRequest{ 28 MachineID: &testMachineID, 29 Password: &testPassword, 30 } 31 32 var UserAgent = fmt.Sprintf("synsec-test/%s", cwversion.Version) 33 34 func LoadTestConfig() csconfig.Config { 35 config := csconfig.Config{} 36 maxAge := "1h" 37 flushConfig := csconfig.FlushDBCfg{ 38 MaxAge: &maxAge, 39 } 40 dbconfig := csconfig.DatabaseCfg{ 41 Type: "sqlite", 42 DbPath: "./ent", 43 Flush: &flushConfig, 44 } 45 apiServerConfig := csconfig.LocalApiServerCfg{ 46 ListenURI: "http://127.0.0.1:8080", 47 DbConfig: &dbconfig, 48 ProfilesPath: "./tests/profiles.yaml", 49 } 50 apiConfig := csconfig.APICfg{ 51 Server: &apiServerConfig, 52 } 53 config.API = &apiConfig 54 if err := config.API.Server.LoadProfiles(); err != nil { 55 log.Fatalf("failed to load profiles: %s", err) 56 } 57 return config 58 } 59 60 func LoadTestConfigForwardedFor() csconfig.Config { 61 config := csconfig.Config{} 62 maxAge := "1h" 63 flushConfig := csconfig.FlushDBCfg{ 64 MaxAge: &maxAge, 65 } 66 dbconfig := csconfig.DatabaseCfg{ 67 Type: "sqlite", 68 DbPath: "./ent", 69 Flush: &flushConfig, 70 } 71 apiServerConfig := csconfig.LocalApiServerCfg{ 72 ListenURI: "http://127.0.0.1:8080", 73 DbConfig: &dbconfig, 74 ProfilesPath: "./tests/profiles.yaml", 75 UseForwardedForHeaders: true, 76 } 77 apiConfig := csconfig.APICfg{ 78 Server: &apiServerConfig, 79 } 80 config.API = &apiConfig 81 if err := config.API.Server.LoadProfiles(); err != nil { 82 log.Fatalf("failed to load profiles: %s", err) 83 } 84 return config 85 } 86 87 func NewAPITest() (*gin.Engine, error) { 88 config := LoadTestConfig() 89 90 os.Remove("./ent") 91 apiServer, err := NewServer(config.API.Server) 92 if err != nil { 93 return nil, fmt.Errorf("unable to run local API: %s", err) 94 } 95 log.Printf("Creating new API server") 96 gin.SetMode(gin.TestMode) 97 router, err := apiServer.Router() 98 if err != nil { 99 return nil, fmt.Errorf("unable to run local API: %s", err) 100 } 101 return router, nil 102 } 103 104 func NewAPITestForwardedFor() (*gin.Engine, error) { 105 config := LoadTestConfigForwardedFor() 106 107 os.Remove("./ent") 108 apiServer, err := NewServer(config.API.Server) 109 if err != nil { 110 return nil, fmt.Errorf("unable to run local API: %s", err) 111 } 112 log.Printf("Creating new API server") 113 gin.SetMode(gin.TestMode) 114 router, err := apiServer.Router() 115 if err != nil { 116 return nil, fmt.Errorf("unable to run local API: %s", err) 117 } 118 return router, nil 119 } 120 121 func ValidateMachine(machineID string) error { 122 config := LoadTestConfig() 123 dbClient, err := database.NewClient(config.API.Server.DbConfig) 124 if err != nil { 125 return fmt.Errorf("unable to create new database client: %s", err) 126 } 127 if err := dbClient.ValidateMachine(machineID); err != nil { 128 return fmt.Errorf("unable to validate machine: %s", err) 129 } 130 return nil 131 } 132 133 func GetMachineIP(machineID string) (string, error) { 134 config := LoadTestConfig() 135 dbClient, err := database.NewClient(config.API.Server.DbConfig) 136 if err != nil { 137 return "", fmt.Errorf("unable to create new database client: %s", err) 138 } 139 machines, err := dbClient.ListMachines() 140 if err != nil { 141 return "", fmt.Errorf("Unable to list machines: %s", err) 142 } 143 for _, machine := range machines { 144 if machine.MachineId == machineID { 145 return machine.IpAddress, nil 146 } 147 } 148 return "", nil 149 } 150 151 func CreateTestMachine(router *gin.Engine) (string, error) { 152 b, err := json.Marshal(MachineTest) 153 if err != nil { 154 return "", fmt.Errorf("unable to marshal MachineTest") 155 } 156 body := string(b) 157 158 w := httptest.NewRecorder() 159 req, _ := http.NewRequest("POST", "/v1/watchers", strings.NewReader(body)) 160 req.Header.Set("User-Agent", UserAgent) 161 router.ServeHTTP(w, req) 162 return body, nil 163 } 164 165 func CreateTestBouncer() (string, error) { 166 config := LoadTestConfig() 167 168 dbClient, err := database.NewClient(config.API.Server.DbConfig) 169 if err != nil { 170 log.Fatalf("unable to create new database client: %s", err) 171 } 172 apiKey, err := middlewares.GenerateAPIKey(keyLength) 173 if err != nil { 174 return "", fmt.Errorf("unable to generate api key: %s", err) 175 } 176 err = dbClient.CreateBouncer("test", "127.0.0.1", middlewares.HashSHA512(apiKey)) 177 if err != nil { 178 return "", fmt.Errorf("unable to create blocker: %s", err) 179 } 180 181 return apiKey, nil 182 } 183 184 func TestWithWrongDBConfig(t *testing.T) { 185 config := LoadTestConfig() 186 config.API.Server.DbConfig.Type = "test" 187 apiServer, err := NewServer(config.API.Server) 188 189 assert.Equal(t, apiServer, &APIServer{}) 190 assert.Equal(t, "unable to init database client: unknown database type", err.Error()) 191 } 192 193 func TestWithWrongFlushConfig(t *testing.T) { 194 config := LoadTestConfig() 195 maxItems := -1 196 config.API.Server.DbConfig.Flush.MaxItems = &maxItems 197 apiServer, err := NewServer(config.API.Server) 198 199 assert.Equal(t, apiServer, &APIServer{}) 200 assert.Equal(t, "max_items can't be zero or negative number", err.Error()) 201 } 202 203 func TestUnknownPath(t *testing.T) { 204 router, err := NewAPITest() 205 if err != nil { 206 log.Fatalf("unable to run local API: %s", err) 207 } 208 209 w := httptest.NewRecorder() 210 req, _ := http.NewRequest("GET", "/test", nil) 211 req.Header.Set("User-Agent", UserAgent) 212 router.ServeHTTP(w, req) 213 214 assert.Equal(t, 404, w.Code) 215 216 }