2024-04-11 15:07:36 -04:00
|
|
|
package combiner
|
|
|
|
|
|
|
|
import (
|
|
|
|
"bytes"
|
|
|
|
"io"
|
|
|
|
"net/http"
|
|
|
|
"strings"
|
|
|
|
"testing"
|
|
|
|
|
|
|
|
"github.com/gogo/protobuf/proto"
|
|
|
|
"github.com/grafana/tempo/pkg/api"
|
|
|
|
"github.com/grafana/tempo/pkg/tempopb"
|
|
|
|
"github.com/grafana/tempo/pkg/util/test"
|
|
|
|
"github.com/stretchr/testify/require"
|
|
|
|
)
|
|
|
|
|
|
|
|
func TestTraceByIDShouldQuit(t *testing.T) {
|
|
|
|
// new combiner should not quit
|
|
|
|
c := NewTraceByID(0, api.HeaderAcceptJSON)
|
|
|
|
should := c.ShouldQuit()
|
|
|
|
require.False(t, should)
|
|
|
|
|
|
|
|
// 500 response should quit
|
|
|
|
c = NewTraceByID(0, api.HeaderAcceptJSON)
|
|
|
|
err := c.AddResponse(toHTTPResponse(t, &tempopb.SearchResponse{}, 500))
|
|
|
|
require.NoError(t, err)
|
|
|
|
should = c.ShouldQuit()
|
|
|
|
require.True(t, should)
|
|
|
|
|
|
|
|
// 429 response should quit
|
|
|
|
c = NewTraceByID(0, api.HeaderAcceptJSON)
|
|
|
|
err = c.AddResponse(toHTTPProtoResponse(t, &tempopb.SearchResponse{}, 429))
|
|
|
|
require.NoError(t, err)
|
|
|
|
should = c.ShouldQuit()
|
|
|
|
require.True(t, should)
|
|
|
|
|
|
|
|
// 404 response should not quit
|
|
|
|
c = NewTraceByID(0, api.HeaderAcceptJSON)
|
|
|
|
err = c.AddResponse(toHTTPProtoResponse(t, &tempopb.SearchResponse{}, 404))
|
|
|
|
require.NoError(t, err)
|
|
|
|
should = c.ShouldQuit()
|
|
|
|
require.False(t, should)
|
|
|
|
|
|
|
|
// unparseable body should not quit, but should return an error
|
|
|
|
c = NewTraceByID(0, api.HeaderAcceptJSON)
|
2025-02-12 16:33:10 -05:00
|
|
|
err = c.AddResponse(&testPipelineResponse{r: &http.Response{Body: io.NopCloser(strings.NewReader("foo")), StatusCode: 200}})
|
2024-04-11 15:07:36 -04:00
|
|
|
require.Error(t, err)
|
|
|
|
should = c.ShouldQuit()
|
|
|
|
require.False(t, should)
|
|
|
|
|
2024-10-18 14:17:29 +00:00
|
|
|
// trace too large, should quit and should not return an error
|
2024-04-11 15:07:36 -04:00
|
|
|
c = NewTraceByID(1, api.HeaderAcceptJSON)
|
|
|
|
err = c.AddResponse(toHTTPProtoResponse(t, &tempopb.TraceByIDResponse{
|
|
|
|
Trace: test.MakeTrace(1, nil),
|
|
|
|
Metrics: &tempopb.TraceByIDMetrics{},
|
|
|
|
}, 200))
|
2024-10-18 14:17:29 +00:00
|
|
|
require.NoError(t, err)
|
2024-04-11 15:07:36 -04:00
|
|
|
should = c.ShouldQuit()
|
2024-10-18 14:17:29 +00:00
|
|
|
require.True(t, should)
|
2024-04-11 15:07:36 -04:00
|
|
|
}
|
|
|
|
|
|
|
|
func TestTraceByIDHonorsContentType(t *testing.T) {
|
|
|
|
expected := test.MakeTrace(2, nil)
|
|
|
|
|
|
|
|
// json
|
|
|
|
c := NewTraceByID(0, api.HeaderAcceptJSON)
|
|
|
|
err := c.AddResponse(toHTTPProtoResponse(t, &tempopb.TraceByIDResponse{Trace: expected}, 200))
|
|
|
|
require.NoError(t, err)
|
|
|
|
|
|
|
|
resp, err := c.HTTPFinal()
|
|
|
|
require.NoError(t, err)
|
|
|
|
|
|
|
|
actual := &tempopb.Trace{}
|
2024-07-25 15:55:35 +02:00
|
|
|
bodyBytes, _ := io.ReadAll(resp.Body)
|
|
|
|
err = tempopb.UnmarshalFromJSONV1(bodyBytes, actual)
|
2024-04-11 15:07:36 -04:00
|
|
|
require.NoError(t, err)
|
|
|
|
require.Equal(t, expected, actual)
|
|
|
|
|
|
|
|
// proto
|
|
|
|
c = NewTraceByID(0, api.HeaderAcceptProtobuf)
|
|
|
|
err = c.AddResponse(toHTTPProtoResponse(t, &tempopb.TraceByIDResponse{Trace: expected}, 200))
|
|
|
|
require.NoError(t, err)
|
|
|
|
|
|
|
|
resp, err = c.HTTPFinal()
|
|
|
|
require.NoError(t, err)
|
|
|
|
|
|
|
|
actual = &tempopb.Trace{}
|
|
|
|
buff, err := io.ReadAll(resp.Body)
|
|
|
|
require.NoError(t, err)
|
|
|
|
err = proto.Unmarshal(buff, actual)
|
|
|
|
require.NoError(t, err)
|
|
|
|
require.Equal(t, expected, actual)
|
|
|
|
}
|
|
|
|
|
2024-04-19 09:07:30 -04:00
|
|
|
func toHTTPProtoResponse(t *testing.T, pb proto.Message, statusCode int) PipelineResponse {
|
2024-04-11 15:07:36 -04:00
|
|
|
var body []byte
|
|
|
|
|
|
|
|
if pb != nil {
|
|
|
|
var err error
|
|
|
|
body, err = proto.Marshal(pb)
|
|
|
|
require.NoError(t, err)
|
|
|
|
}
|
|
|
|
|
2025-02-12 16:33:10 -05:00
|
|
|
return &testPipelineResponse{r: &http.Response{
|
2024-04-11 15:07:36 -04:00
|
|
|
Body: io.NopCloser(bytes.NewReader(body)),
|
|
|
|
StatusCode: statusCode,
|
2024-04-19 09:07:30 -04:00
|
|
|
}}
|
2024-04-11 15:07:36 -04:00
|
|
|
}
|