(t *testing.T)
| 162 | } |
| 163 | |
| 164 | func TestClusterValidationMiddleware(t *testing.T) { |
| 165 | const urlPath = "/Test/Me" |
| 166 | testCases := map[string]struct { |
| 167 | header func(r *http.Request) |
| 168 | serverClusters []string |
| 169 | route string |
| 170 | expectedStatusCode int |
| 171 | expectedErrorMsg string |
| 172 | expectedLogs string |
| 173 | expectedMetrics string |
| 174 | shouldPanic bool |
| 175 | }{ |
| 176 | "empty server cluster makes ClusterUnaryServerInterceptor panic": { |
| 177 | serverClusters: []string{}, |
| 178 | shouldPanic: true, |
| 179 | }, |
| 180 | "equal request and server clusters give no error": { |
| 181 | header: func(r *http.Request) { |
| 182 | r.Header[clusterutil.ClusterValidationLabelHeader] = []string{"cluster"} |
| 183 | }, |
| 184 | serverClusters: []string{"cluster"}, |
| 185 | expectedStatusCode: http.StatusOK, |
| 186 | }, |
| 187 | "different request and server clusters give rise to an error including the request route if soft validation disabled": { |
| 188 | header: func(r *http.Request) { |
| 189 | r.Header[clusterutil.ClusterValidationLabelHeader] = []string{"wrong-cluster"} |
| 190 | }, |
| 191 | serverClusters: []string{"cluster"}, |
| 192 | // Verify that the route from the request context is used. |
| 193 | route: "test_argument", |
| 194 | expectedLogs: `level=warn path=/Test/Me method=GET cluster_validation_labels=[cluster] soft_validation=%t tenant= user_agent= host= client_address= msg="request with wrong cluster validation label" request_cluster_validation_label=wrong-cluster`, |
| 195 | expectedMetrics: ` |
| 196 | # HELP test_server_invalid_cluster_validation_label_requests_total Number of requests received by server with invalid cluster validation label. |
| 197 | # TYPE test_server_invalid_cluster_validation_label_requests_total counter |
| 198 | test_server_invalid_cluster_validation_label_requests_total{cluster_validation_label="cluster",method="test_argument",protocol="http",request_cluster_validation_label="wrong-cluster"} 1 |
| 199 | `, |
| 200 | expectedStatusCode: http.StatusNetworkAuthenticationRequired, |
| 201 | expectedErrorMsg: `rejected request with wrong cluster validation label "wrong-cluster" - it should be one of [cluster]`, |
| 202 | }, |
| 203 | "different request and server clusters give rise to an error handling an unknown request route if soft validation disabled": { |
| 204 | header: func(r *http.Request) { |
| 205 | r.Header[clusterutil.ClusterValidationLabelHeader] = []string{"wrong-cluster"} |
| 206 | }, |
| 207 | serverClusters: []string{"cluster"}, |
| 208 | // Verify that an empty route in the request context is handled. |
| 209 | route: "", |
| 210 | expectedLogs: `level=warn path=/Test/Me method=GET cluster_validation_labels=[cluster] soft_validation=%t tenant= user_agent= host= client_address= msg="request with wrong cluster validation label" request_cluster_validation_label=wrong-cluster`, |
| 211 | expectedMetrics: ` |
| 212 | # HELP test_server_invalid_cluster_validation_label_requests_total Number of requests received by server with invalid cluster validation label. |
| 213 | # TYPE test_server_invalid_cluster_validation_label_requests_total counter |
| 214 | test_server_invalid_cluster_validation_label_requests_total{cluster_validation_label="cluster",method="<unknown-route>",protocol="http",request_cluster_validation_label="wrong-cluster"} 1 |
| 215 | `, |
| 216 | expectedStatusCode: http.StatusNetworkAuthenticationRequired, |
| 217 | expectedErrorMsg: `rejected request with wrong cluster validation label "wrong-cluster" - it should be one of [cluster]`, |
| 218 | }, |
| 219 | "empty request cluster and non-empty server cluster give an error including the request route if soft validation disabled": { |
| 220 | header: func(r *http.Request) { |
| 221 | r.Header[clusterutil.ClusterValidationLabelHeader] = []string{""} |
nothing calls this directly
no test coverage detected