cloudflare/pint

Public

mirrored from https://github.com/cloudflare/pintAvailable

CodeCommitsIssuesPull requestsActionsInsightsSecurity
v0.22.2

Branches

Tags

  • No tags available.
0Branches0Tags
Go to file
Add file
Code

Clone

HTTPS

Download ZIP

internal/promapi/query_test.go

207lines · modecode

1package promapi_test
2
3import (
4 "context"
5 "net/http"
6 "net/http/httptest"
7 "testing"
8 "time"
9
10 "github.com/prometheus/common/model"
11 "github.com/stretchr/testify/assert"
12
13 "github.com/cloudflare/pint/internal/promapi"
14)
15
16func TestQuery(t *testing.T) {
17 srv := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
18 err := r.ParseForm()
19 if err != nil {
20 t.Fatal(err)
21 }
22 query := r.Form.Get("query")
23
24 switch query {
25 case "empty":
26 w.WriteHeader(200)
27 w.Header().Set("Content-Type", "application/json")
28 _, _ = w.Write([]byte(`{
29 "status":"success",
30 "data":{
31 "resultType":"vector",
32 "result":[]
33 }
34 }`))
35 case "single_result":
36 w.WriteHeader(200)
37 w.Header().Set("Content-Type", "application/json")
38 _, _ = w.Write([]byte(`{
39 "status":"success",
40 "data":{
41 "resultType":"vector",
42 "result":[{"metric":{},"value":[1614859502.068,"1"]}]
43 }
44 }`))
45 case "three_results":
46 w.WriteHeader(200)
47 w.Header().Set("Content-Type", "application/json")
48 _, _ = w.Write([]byte(`{
49 "status":"success",
50 "data":{
51 "resultType":"vector",
52 "result":[
53 {"metric":{"instance": "1"},"value":[1614859502.068,"1"]},
54 {"metric":{"instance": "2"},"value":[1614859502.168,"2"]},
55 {"metric":{"instance": "3"},"value":[1614859503.000,"3"]}
56 ]
57 }
58 }`))
59 case "once":
60 w.WriteHeader(200)
61 w.Header().Set("Content-Type", "application/json")
62 _, _ = w.Write([]byte(`{
63 "status":"success",
64 "data":{
65 "resultType":"vector",
66 "result":[{"metric":{},"value":[1614859502.068,"1"]}]
67 }
68 }`))
69 case "matrix":
70 w.WriteHeader(200)
71 w.Header().Set("Content-Type", "application/json")
72 _, _ = w.Write([]byte(`{
73 "status":"success",
74 "data":{
75 "resultType":"matrix",
76 "result":[]
77 }
78 }`))
79 case "timeout":
80 w.WriteHeader(200)
81 w.Header().Set("Content-Type", "application/json")
82 time.Sleep(time.Second)
83 _, _ = w.Write([]byte(`{
84 "status":"success",
85 "data":{
86 "resultType":"vector",
87 "result":[]
88 }
89 }`))
90 default:
91 w.WriteHeader(400)
92 w.Header().Set("Content-Type", "application/json")
93 _, _ = w.Write([]byte(`{
94 "status":"error",
95 "errorType":"bad_data",
96 "error":"unhandled query"
97 }`))
98 }
99 }))
100 defer srv.Close()
101
102 type testCaseT struct {
103 query string
104 timeout time.Duration
105 result promapi.QueryResult
106 err string
107 }
108
109 testCases := []testCaseT{
110 {
111 query: "empty",
112 timeout: time.Second,
113 result: promapi.QueryResult{
114 URI: srv.URL,
115 Series: model.Vector{},
116 },
117 },
118 {
119 query: "single_result",
120 timeout: time.Second,
121 result: promapi.QueryResult{
122 URI: srv.URL,
123 Series: model.Vector{
124 &model.Sample{
125 Metric: model.Metric{},
126 Value: model.SampleValue(1),
127 Timestamp: model.Time(1614859502068),
128 },
129 },
130 },
131 },
132 {
133 query: "three_results",
134 timeout: time.Second,
135 result: promapi.QueryResult{
136 URI: srv.URL,
137 Series: model.Vector{
138 &model.Sample{
139 Metric: model.Metric{"instance": "1"},
140 Value: model.SampleValue(1),
141 Timestamp: model.Time(1614859502068),
142 },
143 &model.Sample{
144 Metric: model.Metric{"instance": "2"},
145 Value: model.SampleValue(2),
146 Timestamp: model.Time(1614859502168),
147 },
148 &model.Sample{
149 Metric: model.Metric{"instance": "3"},
150 Value: model.SampleValue(3),
151 Timestamp: model.Time(1614859503000),
152 },
153 },
154 },
155 },
156 {
157 query: "error",
158 timeout: time.Second,
159 err: "bad_data: unhandled query",
160 },
161 {
162 query: "matrix",
163 timeout: time.Second,
164 err: "unknown result type: matrix",
165 },
166 {
167 query: "timeout",
168 timeout: time.Millisecond * 20,
169 err: "connection timeout",
170 },
171 {
172 query: "once",
173 timeout: time.Second,
174 result: promapi.QueryResult{
175 URI: srv.URL,
176 Series: model.Vector{
177 &model.Sample{
178 Metric: model.Metric{},
179 Value: model.SampleValue(1),
180 Timestamp: model.Time(1614859502068),
181 },
182 },
183 },
184 },
185 }
186
187 for _, tc := range testCases {
188 t.Run(tc.query, func(t *testing.T) {
189 assert := assert.New(t)
190
191 prom := promapi.NewPrometheus("test", srv.URL, tc.timeout, 1)
192 prom.StartWorkers()
193 defer prom.Close()
194
195 qr, err := prom.Query(context.Background(), tc.query)
196 if tc.err != "" {
197 assert.EqualError(err, tc.err, tc)
198 } else {
199 assert.NoError(err)
200 }
201 if qr != nil {
202 assert.Equal(tc.result.URI, qr.URI)
203 assert.Equal(tc.result.Series, qr.Series)
204 }
205 })
206 }
207}
208