@ -9,13 +9,12 @@ import (
"net/http/httptest"
"net/http/httptest"
"testing"
"testing"
"google.golang.org/grpc/codes"
"github.com/gogo/status"
"google.golang.org/grpc/status"
"github.com/grafana/dskit/httpgrpc"
"github.com/grafana/dskit/httpgrpc"
"github.com/grafana/dskit/user"
"github.com/grafana/dskit/user"
"github.com/prometheus/prometheus/promql"
"github.com/prometheus/prometheus/promql"
"github.com/stretchr/testify/require"
"github.com/stretchr/testify/require"
"google.golang.org/grpc/codes"
"github.com/grafana/loki/pkg/logqlmodel"
"github.com/grafana/loki/pkg/logqlmodel"
storage_errors "github.com/grafana/loki/pkg/storage/errors"
storage_errors "github.com/grafana/loki/pkg/storage/errors"
@ -32,9 +31,9 @@ func Test_writeError(t *testing.T) {
} {
} {
{ "cancelled" , context . Canceled , ErrClientCanceled , StatusClientClosedRequest } ,
{ "cancelled" , context . Canceled , ErrClientCanceled , StatusClientClosedRequest } ,
{ "cancelled multi" , util . MultiError { context . Canceled , context . Canceled } , ErrClientCanceled , StatusClientClosedRequest } ,
{ "cancelled multi" , util . MultiError { context . Canceled , context . Canceled } , ErrClientCanceled , StatusClientClosedRequest } ,
{ "rpc cancelled" , status . New ( codes . Canceled , context . Canceled . Error ( ) ) . Err ( ) , "rpc error: code = Canceled desc = context canceled" , http . StatusInternalServerError } ,
{ "rpc cancelled" , status . Error ( codes . Canceled , context . Canceled . Error ( ) ) , "rpc error: code = Canceled desc = context canceled" , http . StatusInternalServerError } ,
{ "rpc cancelled multi" , util . MultiError { status . New ( codes . Canceled , context . Canceled . Error ( ) ) . Err ( ) , status . New ( codes . Canceled , context . Canceled . Error ( ) ) . Err ( ) } , "2 errors: rpc error: code = Canceled desc = context canceled; rpc error: code = Canceled desc = context canceled" , http . StatusInternalServerError } ,
{ "rpc cancelled multi" , util . MultiError { status . Error ( codes . Canceled , context . Canceled . Error ( ) ) , status . Error ( codes . Canceled , context . Canceled . Error ( ) ) } , "2 errors: rpc error: code = Canceled desc = context canceled; rpc error: code = Canceled desc = context canceled" , http . StatusInternalServerError } ,
{ "mixed context and rpc cancelled" , util . MultiError { context . Canceled , status . New ( codes . Canceled , context . Canceled . Error ( ) ) . Err ( ) } , "2 errors: context canceled; rpc error: code = Canceled desc = context canceled" , http . StatusInternalServerError } ,
{ "mixed context and rpc cancelled" , util . MultiError { context . Canceled , status . Error ( codes . Canceled , context . Canceled . Error ( ) ) } , "2 errors: context canceled; rpc error: code = Canceled desc = context canceled" , http . StatusInternalServerError } ,
{ "mixed context, rpc cancelled and another" , util . MultiError { errors . New ( "standard error" ) , context . Canceled , status . New ( codes . Canceled , context . Canceled . Error ( ) ) . Err ( ) } , "3 errors: standard error; context canceled; rpc error: code = Canceled desc = context canceled" , http . StatusInternalServerError } ,
{ "mixed context, rpc cancelled and another" , util . MultiError { errors . New ( "standard error" ) , context . Canceled , status . New ( codes . Canceled , context . Canceled . Error ( ) ) . Err ( ) } , "3 errors: standard error; context canceled; rpc error: code = Canceled desc = context canceled" , http . StatusInternalServerError } ,
{ "cancelled storage" , promql . ErrStorage { Err : context . Canceled } , ErrClientCanceled , StatusClientClosedRequest } ,
{ "cancelled storage" , promql . ErrStorage { Err : context . Canceled } , ErrClientCanceled , StatusClientClosedRequest } ,
{ "orgid" , user . ErrNoOrgID , user . ErrNoOrgID . Error ( ) , http . StatusBadRequest } ,
{ "orgid" , user . ErrNoOrgID , user . ErrNoOrgID . Error ( ) , http . StatusBadRequest } ,
@ -56,9 +55,19 @@ func Test_writeError(t *testing.T) {
WriteError ( tt . err , rec )
WriteError ( tt . err , rec )
require . Equal ( t , tt . expectedStatus , rec . Result ( ) . StatusCode )
require . Equal ( t , tt . expectedStatus , rec . Result ( ) . StatusCode )
b , err := io . ReadAll ( rec . Result ( ) . Body )
b , err := io . ReadAll ( rec . Result ( ) . Body )
if err != nil {
require . NoError ( t , err )
t . Fatal ( err )
require . Equal ( t , tt . msg , string ( b [ : len ( b ) - 1 ] ) )
}
} )
t . Run ( tt . name + "-roundtrip" , func ( t * testing . T ) {
status := WrapError ( tt . err )
unwrappedErr := UnwrapError ( status )
rec := httptest . NewRecorder ( )
WriteError ( unwrappedErr , rec )
require . Equal ( t , tt . expectedStatus , rec . Result ( ) . StatusCode )
b , err := io . ReadAll ( rec . Result ( ) . Body )
require . NoError ( t , err )
require . Equal ( t , tt . msg , string ( b [ : len ( b ) - 1 ] ) )
require . Equal ( t , tt . msg , string ( b [ : len ( b ) - 1 ] ) )
} )
} )
}
}