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  }