github.com/kuoss/venti@v0.2.20/pkg/handler/remote/remote_test.go (about)

     1  package remote
     2  
     3  import (
     4  	"fmt"
     5  	"net/http"
     6  	"net/http/httptest"
     7  	"os"
     8  	"testing"
     9  	"time"
    10  
    11  	"github.com/gin-gonic/gin"
    12  	"github.com/kuoss/common/logger"
    13  	ms "github.com/kuoss/venti/pkg/mock/servers"
    14  	"github.com/kuoss/venti/pkg/model"
    15  	dsService "github.com/kuoss/venti/pkg/service/datasource"
    16  	"github.com/kuoss/venti/pkg/service/discovery"
    17  	"github.com/kuoss/venti/pkg/service/remote"
    18  	"github.com/stretchr/testify/assert"
    19  )
    20  
    21  var (
    22  	servers        *ms.Servers
    23  	remoteHandler1 *RemoteHandler
    24  	remoteRouter   *gin.Engine
    25  )
    26  
    27  func TestMain(m *testing.M) {
    28  	setup()
    29  	code := m.Run()
    30  	shutdown()
    31  	os.Exit(code)
    32  }
    33  
    34  func shutdown() {
    35  	servers.Close()
    36  }
    37  
    38  func setup() {
    39  	logger.SetLevel(logger.DebugLevel)
    40  	servers = ms.New(ms.Requirements{
    41  		{Type: ms.TypePrometheus, Name: "prometheus1", IsMain: true},
    42  		{Type: ms.TypePrometheus, Name: "prometheus2", IsMain: false},
    43  		{Type: ms.TypeLethe, Name: "lethe1", IsMain: true},
    44  		{Type: ms.TypeLethe, Name: "lethe2", IsMain: false},
    45  	})
    46  	var discoverer discovery.Discoverer
    47  	datasourceService, err := dsService.New(&model.DatasourceConfig{Datasources: servers.GetDatasources()}, discoverer)
    48  	if err != nil {
    49  		panic(err)
    50  	}
    51  	remoteService := remote.New(&http.Client{}, 30*time.Second)
    52  	remoteHandler1 = New(datasourceService, remoteService)
    53  
    54  	// router
    55  	remoteRouter = gin.New()
    56  	api := remoteRouter.Group("/api")
    57  	api.GET("/remote/metadata", remoteHandler1.Metadata)
    58  	api.GET("/remote/query", remoteHandler1.Query)
    59  	api.GET("/remote/query_range", remoteHandler1.QueryRange)
    60  }
    61  
    62  func TestNew(t *testing.T) {
    63  	assert.NotEmpty(t, remoteHandler1.datasourceService)
    64  
    65  	assert.NotEmpty(t, remoteHandler1.remoteService)
    66  
    67  	var ds model.Datasource
    68  	var err error
    69  
    70  	ds, err = remoteHandler1.datasourceService.GetDatasourceByIndex(0)
    71  	assert.NoError(t, err)
    72  	assert.Equal(t, "prometheus1", ds.Name)
    73  
    74  	ds, err = remoteHandler1.datasourceService.GetDatasourceByIndex(3)
    75  	assert.NoError(t, err)
    76  	assert.Equal(t, "lethe2", ds.Name)
    77  }
    78  
    79  func TestBuildInfo(t *testing.T) {
    80  	w := httptest.NewRecorder()
    81  	req, err := http.NewRequest("GET", "/api/remote/metadata?dsName=prometheus1", nil)
    82  	assert.NoError(t, err)
    83  
    84  	remoteRouter.ServeHTTP(w, req)
    85  	assert.Equal(t, 200, w.Code)
    86  	assert.Equal(t, `{"status":"success","data":{"apiserver_audit_event_total":[{"type":"counter","help":"[ALPHA] Counter of audit events generated and sent to the audit backend.","unit":""}]}}`, w.Body.String())
    87  }
    88  
    89  func TestMetadata(t *testing.T) {
    90  	w := httptest.NewRecorder()
    91  	req, err := http.NewRequest("GET", "/api/remote/metadata?dsName=prometheus1", nil)
    92  	assert.NoError(t, err)
    93  
    94  	remoteRouter.ServeHTTP(w, req)
    95  	assert.Equal(t, 200, w.Code)
    96  	assert.Equal(t, `{"status":"success","data":{"apiserver_audit_event_total":[{"type":"counter","help":"[ALPHA] Counter of audit events generated and sent to the audit backend.","unit":""}]}}`, w.Body.String())
    97  }
    98  
    99  func TestQuery(t *testing.T) {
   100  	testCases := []struct {
   101  		rawQuery string
   102  		wantCode int
   103  		wantBody string
   104  	}{
   105  		{
   106  			"",
   107  			405, `{"status":"error","errorType":"bad_data","error":"invalid parameter \"query\": 1:1: parse error: no expression found in input"}`,
   108  		},
   109  		{
   110  			"query=up",
   111  			200, `{"status":"success","data":{"resultType":"vector","result":[{"metric":{"__name__":"up","job":"prometheus","instance":"localhost:9090"},"value":[1435781451.781,"1"]},{"metric":{"__name__":"up","job":"prometheus2","instance2":"localhost:9092"},"value":[1435781451.781,"1"]}]}}`,
   112  		},
   113  		{
   114  			"query=not_exists",
   115  			200, `{"status":"success","data":{"resultType":"vector","result":[]}}`,
   116  		},
   117  	}
   118  	for _, tc := range testCases {
   119  		t.Run("", func(t *testing.T) {
   120  			w := httptest.NewRecorder()
   121  			req, err := http.NewRequest("GET", "/api/remote/query?dsName=prometheus1&"+tc.rawQuery, nil)
   122  			assert.NoError(t, err)
   123  
   124  			remoteRouter.ServeHTTP(w, req)
   125  			assert.Equal(t, tc.wantCode, w.Code)
   126  			assert.Equal(t, tc.wantBody, w.Body.String())
   127  		})
   128  	}
   129  }
   130  
   131  func TestQueryRange(t *testing.T) {
   132  	testCases := []struct {
   133  		rawQuery string
   134  		wantCode int
   135  		wantBody string
   136  	}{
   137  		{
   138  			"",
   139  			405, `{"status":"error","errorType":"bad_data","error":"invalid parameter \"start\": cannot parse \"\" to a valid timestamp"}`,
   140  		},
   141  		{
   142  			"query=up",
   143  			405, `{"status":"error","errorType":"bad_data","error":"invalid parameter \"start\": cannot parse \"\" to a valid timestamp"}`,
   144  		},
   145  		{
   146  			"query=not_exists",
   147  			405, `{"status":"error","errorType":"bad_data","error":"invalid parameter \"start\": cannot parse \"\" to a valid timestamp"}`,
   148  		},
   149  		{
   150  			"query=not_exists&start=2015-07-01T20:10:30.781Z",
   151  			405, `{"status":"error","errorType":"bad_data","error":"invalid parameter \"end\": cannot parse \"\" to a valid timestamp"}`,
   152  		},
   153  		{
   154  			"query=not_exists&start=2015-07-01T20:10:30.781Z&end=2015-07-01T20:11:00.781Z",
   155  			405, `{"status":"error","errorType":"bad_data","error":"invalid parameter \"step\": cannot parse \"\" to a valid duration"}`,
   156  		},
   157  		{
   158  			"query=not_exists&start=2015-07-01T20:10:30.781Z&end=2015-07-01T20:11:00.781Z&step=15s",
   159  			200, `{"status":"success","data":{"resultType":"matrix","result":[]}}`,
   160  		},
   161  		{
   162  			"query=up&start=2015-07-01T20:10:30.781Z&end=2015-07-01T20:11:00.781Z&step=15s",
   163  			200, `{"status":"success","data":{"resultType":"matrix","result":[{"metric":{"__name__":"up","job":"prometheus","instance":"localhost:9090"},"values":[[1435781430.781,"1"],[1435781445.781,"1"],[1435781460.781,"1"]]}]}}`,
   164  		},
   165  	}
   166  	for i, tc := range testCases {
   167  		t.Run(fmt.Sprintf("#%d - %s", i, tc.rawQuery), func(tt *testing.T) {
   168  			w := httptest.NewRecorder()
   169  			req, err := http.NewRequest("GET", "/api/remote/query_range?dsName=prometheus1&"+tc.rawQuery, nil)
   170  			assert.NoError(tt, err)
   171  
   172  			remoteRouter.ServeHTTP(w, req)
   173  			assert.Equal(tt, tc.wantCode, w.Code)
   174  			assert.Equal(tt, tc.wantBody, w.Body.String())
   175  		})
   176  	}
   177  }