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 }