2018-01-25 12:00:05 +01:00
package integration
import (
"net/http"
2024-01-09 17:00:07 +01:00
"testing"
2018-01-25 12:00:05 +01:00
"time"
2024-01-09 17:00:07 +01:00
"github.com/stretchr/testify/require"
"github.com/stretchr/testify/suite"
2020-09-16 15:46:04 +02:00
"github.com/traefik/traefik/v2/integration/try"
2018-01-25 12:00:05 +01:00
)
type TracingSuite struct {
BaseSuite
2024-01-09 17:00:07 +01:00
whoamiIP string
whoamiPort int
tracerZipkinIP string
tracerJaegerIP string
}
func TestTracingSuite ( t * testing . T ) {
suite . Run ( t , new ( TracingSuite ) )
2018-01-25 12:00:05 +01:00
}
type TracingTemplate struct {
2021-11-25 10:10:06 +00:00
WhoamiIP string
WhoamiPort int
2019-10-15 16:30:06 +02:00
IP string
TraceContextHeaderName string
2018-01-25 12:00:05 +01:00
}
2024-01-09 17:00:07 +01:00
func ( s * TracingSuite ) SetupSuite ( ) {
s . BaseSuite . SetupSuite ( )
s . createComposeProject ( "tracing" )
s . composeUp ( )
2018-01-25 12:00:05 +01:00
2024-01-09 17:00:07 +01:00
s . whoamiIP = s . getComposeServiceIP ( "whoami" )
2021-11-25 10:10:06 +00:00
s . whoamiPort = 80
2018-01-25 12:00:05 +01:00
}
2024-01-09 17:00:07 +01:00
func ( s * TracingSuite ) TearDownSuite ( ) {
s . BaseSuite . TearDownSuite ( )
}
func ( s * TracingSuite ) startZipkin ( ) {
s . composeUp ( "zipkin" )
s . tracerZipkinIP = s . getComposeServiceIP ( "zipkin" )
2018-01-25 12:00:05 +01:00
// Wait for Zipkin to turn ready.
2024-01-09 17:00:07 +01:00
err := try . GetRequest ( "http://" + s . tracerZipkinIP + ":9411/api/v2/services" , 20 * time . Second , try . StatusCodeIs ( http . StatusOK ) )
require . NoError ( s . T ( ) , err )
2018-01-25 12:00:05 +01:00
}
2024-01-09 17:00:07 +01:00
func ( s * TracingSuite ) TestZipkinRateLimit ( ) {
s . startZipkin ( )
2021-11-25 10:10:06 +00:00
2024-01-09 17:00:07 +01:00
file := s . adaptFile ( "fixtures/tracing/simple-zipkin.toml" , TracingTemplate {
2021-11-25 10:10:06 +00:00
WhoamiIP : s . whoamiIP ,
WhoamiPort : s . whoamiPort ,
2024-01-09 17:00:07 +01:00
IP : s . tracerZipkinIP ,
2018-01-25 12:00:05 +01:00
} )
2021-11-25 10:10:06 +00:00
2024-01-09 17:00:07 +01:00
s . traefikCmd ( withConfigFile ( file ) )
2018-01-25 12:00:05 +01:00
2019-05-16 10:58:06 +02:00
// wait for traefik
2024-01-09 17:00:07 +01:00
err := try . GetRequest ( "http://127.0.0.1:8080/api/rawdata" , time . Second , try . BodyContains ( "basic-auth" ) )
require . NoError ( s . T ( ) , err )
2019-05-16 10:58:06 +02:00
2018-01-25 12:00:05 +01:00
err = try . GetRequest ( "http://127.0.0.1:8000/ratelimit" , 500 * time . Millisecond , try . StatusCodeIs ( http . StatusOK ) )
2024-01-09 17:00:07 +01:00
require . NoError ( s . T ( ) , err )
2018-01-25 12:00:05 +01:00
err = try . GetRequest ( "http://127.0.0.1:8000/ratelimit" , 500 * time . Millisecond , try . StatusCodeIs ( http . StatusOK ) )
2024-01-09 17:00:07 +01:00
require . NoError ( s . T ( ) , err )
2018-01-25 12:00:05 +01:00
err = try . GetRequest ( "http://127.0.0.1:8000/ratelimit" , 500 * time . Millisecond , try . StatusCodeIs ( http . StatusTooManyRequests ) )
2024-01-09 17:00:07 +01:00
require . NoError ( s . T ( ) , err )
2018-01-25 12:00:05 +01:00
// sleep for 4 seconds to be certain the configured time period has elapsed
// then test another request and verify a 200 status code
time . Sleep ( 4 * time . Second )
err = try . GetRequest ( "http://127.0.0.1:8000/ratelimit" , 500 * time . Millisecond , try . StatusCodeIs ( http . StatusOK ) )
2024-01-09 17:00:07 +01:00
require . NoError ( s . T ( ) , err )
2018-01-25 12:00:05 +01:00
// continue requests at 3 second intervals to test the other rate limit time period
time . Sleep ( 3 * time . Second )
err = try . GetRequest ( "http://127.0.0.1:8000/ratelimit" , 500 * time . Millisecond , try . StatusCodeIs ( http . StatusOK ) )
2024-01-09 17:00:07 +01:00
require . NoError ( s . T ( ) , err )
2018-01-25 12:00:05 +01:00
time . Sleep ( 3 * time . Second )
err = try . GetRequest ( "http://127.0.0.1:8000/ratelimit" , 500 * time . Millisecond , try . StatusCodeIs ( http . StatusOK ) )
2024-01-09 17:00:07 +01:00
require . NoError ( s . T ( ) , err )
2018-01-25 12:00:05 +01:00
time . Sleep ( 3 * time . Second )
err = try . GetRequest ( "http://127.0.0.1:8000/ratelimit" , 500 * time . Millisecond , try . StatusCodeIs ( http . StatusTooManyRequests ) )
2024-01-09 17:00:07 +01:00
require . NoError ( s . T ( ) , err )
2018-01-25 12:00:05 +01:00
2024-01-09 17:00:07 +01:00
err = try . GetRequest ( "http://" + s . tracerZipkinIP + ":9411/api/v2/spans?serviceName=tracing" , 20 * time . Second , try . BodyContains ( "forward service1/router1@file" , "ratelimit-1@file" ) )
require . NoError ( s . T ( ) , err )
2018-01-25 12:00:05 +01:00
}
2024-01-09 17:00:07 +01:00
func ( s * TracingSuite ) TestZipkinRetry ( ) {
s . startZipkin ( )
2021-11-25 10:10:06 +00:00
2024-01-09 17:00:07 +01:00
file := s . adaptFile ( "fixtures/tracing/simple-zipkin.toml" , TracingTemplate {
2021-11-25 10:10:06 +00:00
WhoamiIP : s . whoamiIP ,
WhoamiPort : 81 ,
2024-01-09 17:00:07 +01:00
IP : s . tracerZipkinIP ,
2018-01-25 12:00:05 +01:00
} )
2024-01-09 17:00:07 +01:00
s . traefikCmd ( withConfigFile ( file ) )
2018-01-25 12:00:05 +01:00
2019-05-16 10:58:06 +02:00
// wait for traefik
2024-01-09 17:00:07 +01:00
err := try . GetRequest ( "http://127.0.0.1:8080/api/rawdata" , time . Second , try . BodyContains ( "basic-auth" ) )
require . NoError ( s . T ( ) , err )
2019-05-16 10:58:06 +02:00
2018-01-25 12:00:05 +01:00
err = try . GetRequest ( "http://127.0.0.1:8000/retry" , 500 * time . Millisecond , try . StatusCodeIs ( http . StatusBadGateway ) )
2024-01-09 17:00:07 +01:00
require . NoError ( s . T ( ) , err )
2018-01-25 12:00:05 +01:00
2024-01-09 17:00:07 +01:00
err = try . GetRequest ( "http://" + s . tracerZipkinIP + ":9411/api/v2/spans?serviceName=tracing" , 20 * time . Second , try . BodyContains ( "forward service2/router2@file" , "retry@file" ) )
require . NoError ( s . T ( ) , err )
2018-01-25 12:00:05 +01:00
}
2024-01-09 17:00:07 +01:00
func ( s * TracingSuite ) TestZipkinAuth ( ) {
s . startZipkin ( )
2021-11-25 10:10:06 +00:00
2024-01-09 17:00:07 +01:00
file := s . adaptFile ( "fixtures/tracing/simple-zipkin.toml" , TracingTemplate {
2021-11-25 10:10:06 +00:00
WhoamiIP : s . whoamiIP ,
WhoamiPort : s . whoamiPort ,
2024-01-09 17:00:07 +01:00
IP : s . tracerZipkinIP ,
2018-01-25 12:00:05 +01:00
} )
2024-01-09 17:00:07 +01:00
s . traefikCmd ( withConfigFile ( file ) )
2018-01-25 12:00:05 +01:00
2019-05-16 10:58:06 +02:00
// wait for traefik
2024-01-09 17:00:07 +01:00
err := try . GetRequest ( "http://127.0.0.1:8080/api/rawdata" , time . Second , try . BodyContains ( "basic-auth" ) )
require . NoError ( s . T ( ) , err )
2019-05-16 10:58:06 +02:00
2018-01-25 12:00:05 +01:00
err = try . GetRequest ( "http://127.0.0.1:8000/auth" , 500 * time . Millisecond , try . StatusCodeIs ( http . StatusUnauthorized ) )
2024-01-09 17:00:07 +01:00
require . NoError ( s . T ( ) , err )
2018-01-25 12:00:05 +01:00
2024-01-09 17:00:07 +01:00
err = try . GetRequest ( "http://" + s . tracerZipkinIP + ":9411/api/v2/spans?serviceName=tracing" , 20 * time . Second , try . BodyContains ( "entrypoint web" , "basic-auth@file" ) )
require . NoError ( s . T ( ) , err )
2019-06-28 00:16:04 +02:00
}
2024-01-09 17:00:07 +01:00
func ( s * TracingSuite ) startJaeger ( ) {
s . composeUp ( "jaeger" , "whoami" )
s . tracerJaegerIP = s . getComposeServiceIP ( "jaeger" )
2019-06-28 00:16:04 +02:00
// Wait for Jaeger to turn ready.
2024-01-09 17:00:07 +01:00
err := try . GetRequest ( "http://" + s . tracerJaegerIP + ":16686/api/services" , 20 * time . Second , try . StatusCodeIs ( http . StatusOK ) )
require . NoError ( s . T ( ) , err )
2019-06-28 00:16:04 +02:00
}
2024-01-09 17:00:07 +01:00
func ( s * TracingSuite ) TestJaegerRateLimit ( ) {
s . startJaeger ( )
// defer s.composeStop(c, "jaeger")
2021-11-25 10:10:06 +00:00
2024-01-09 17:00:07 +01:00
file := s . adaptFile ( "fixtures/tracing/simple-jaeger.toml" , TracingTemplate {
2021-11-25 10:10:06 +00:00
WhoamiIP : s . whoamiIP ,
WhoamiPort : s . whoamiPort ,
2024-01-09 17:00:07 +01:00
IP : s . tracerJaegerIP ,
2019-10-15 16:30:06 +02:00
TraceContextHeaderName : "uber-trace-id" ,
2019-06-28 00:16:04 +02:00
} )
2024-01-09 17:00:07 +01:00
s . traefikCmd ( withConfigFile ( file ) )
2019-06-28 00:16:04 +02:00
// wait for traefik
2024-01-09 17:00:07 +01:00
err := try . GetRequest ( "http://127.0.0.1:8080/api/rawdata" , time . Second , try . BodyContains ( "basic-auth" ) )
require . NoError ( s . T ( ) , err )
2019-06-28 00:16:04 +02:00
err = try . GetRequest ( "http://127.0.0.1:8000/ratelimit" , 500 * time . Millisecond , try . StatusCodeIs ( http . StatusOK ) )
2024-01-09 17:00:07 +01:00
require . NoError ( s . T ( ) , err )
2019-06-28 00:16:04 +02:00
err = try . GetRequest ( "http://127.0.0.1:8000/ratelimit" , 500 * time . Millisecond , try . StatusCodeIs ( http . StatusOK ) )
2024-01-09 17:00:07 +01:00
require . NoError ( s . T ( ) , err )
2019-06-28 00:16:04 +02:00
err = try . GetRequest ( "http://127.0.0.1:8000/ratelimit" , 500 * time . Millisecond , try . StatusCodeIs ( http . StatusTooManyRequests ) )
2024-01-09 17:00:07 +01:00
require . NoError ( s . T ( ) , err )
2019-06-28 00:16:04 +02:00
// sleep for 4 seconds to be certain the configured time period has elapsed
// then test another request and verify a 200 status code
time . Sleep ( 4 * time . Second )
err = try . GetRequest ( "http://127.0.0.1:8000/ratelimit" , 500 * time . Millisecond , try . StatusCodeIs ( http . StatusOK ) )
2024-01-09 17:00:07 +01:00
require . NoError ( s . T ( ) , err )
2019-06-28 00:16:04 +02:00
// continue requests at 3 second intervals to test the other rate limit time period
time . Sleep ( 3 * time . Second )
err = try . GetRequest ( "http://127.0.0.1:8000/ratelimit" , 500 * time . Millisecond , try . StatusCodeIs ( http . StatusOK ) )
2024-01-09 17:00:07 +01:00
require . NoError ( s . T ( ) , err )
2019-06-28 00:16:04 +02:00
time . Sleep ( 3 * time . Second )
err = try . GetRequest ( "http://127.0.0.1:8000/ratelimit" , 500 * time . Millisecond , try . StatusCodeIs ( http . StatusOK ) )
2024-01-09 17:00:07 +01:00
require . NoError ( s . T ( ) , err )
2019-06-28 00:16:04 +02:00
err = try . GetRequest ( "http://127.0.0.1:8000/ratelimit" , 500 * time . Millisecond , try . StatusCodeIs ( http . StatusTooManyRequests ) )
2024-01-09 17:00:07 +01:00
require . NoError ( s . T ( ) , err )
2019-06-28 00:16:04 +02:00
2024-01-09 17:00:07 +01:00
err = try . GetRequest ( "http://" + s . tracerJaegerIP + ":16686/api/traces?service=tracing" , 20 * time . Second , try . BodyContains ( "forward service1/router1@file" , "ratelimit-1@file" ) )
require . NoError ( s . T ( ) , err )
2019-06-28 00:16:04 +02:00
}
2024-01-09 17:00:07 +01:00
func ( s * TracingSuite ) TestJaegerRetry ( ) {
s . startJaeger ( )
// defer s.composeStop(c, "jaeger")
2021-11-25 10:10:06 +00:00
2024-01-09 17:00:07 +01:00
file := s . adaptFile ( "fixtures/tracing/simple-jaeger.toml" , TracingTemplate {
2021-11-25 10:10:06 +00:00
WhoamiIP : s . whoamiIP ,
WhoamiPort : 81 ,
2024-01-09 17:00:07 +01:00
IP : s . tracerJaegerIP ,
2019-10-15 16:30:06 +02:00
TraceContextHeaderName : "uber-trace-id" ,
2019-06-28 00:16:04 +02:00
} )
2024-01-09 17:00:07 +01:00
s . traefikCmd ( withConfigFile ( file ) )
2019-06-28 00:16:04 +02:00
// wait for traefik
2024-01-09 17:00:07 +01:00
err := try . GetRequest ( "http://127.0.0.1:8080/api/rawdata" , time . Second , try . BodyContains ( "basic-auth" ) )
require . NoError ( s . T ( ) , err )
2019-06-28 00:16:04 +02:00
err = try . GetRequest ( "http://127.0.0.1:8000/retry" , 500 * time . Millisecond , try . StatusCodeIs ( http . StatusBadGateway ) )
2024-01-09 17:00:07 +01:00
require . NoError ( s . T ( ) , err )
2019-06-28 00:16:04 +02:00
2024-01-09 17:00:07 +01:00
err = try . GetRequest ( "http://" + s . tracerJaegerIP + ":16686/api/traces?service=tracing" , 20 * time . Second , try . BodyContains ( "forward service2/router2@file" , "retry@file" ) )
require . NoError ( s . T ( ) , err )
2019-06-28 00:16:04 +02:00
}
2024-01-09 17:00:07 +01:00
func ( s * TracingSuite ) TestJaegerAuth ( ) {
s . startJaeger ( )
// defer s.composeStop(c, "jaeger")
2021-11-25 10:10:06 +00:00
2024-01-09 17:00:07 +01:00
file := s . adaptFile ( "fixtures/tracing/simple-jaeger.toml" , TracingTemplate {
2021-11-25 10:10:06 +00:00
WhoamiIP : s . whoamiIP ,
WhoamiPort : s . whoamiPort ,
2024-01-09 17:00:07 +01:00
IP : s . tracerJaegerIP ,
2019-10-15 16:30:06 +02:00
TraceContextHeaderName : "uber-trace-id" ,
} )
2024-01-09 17:00:07 +01:00
s . traefikCmd ( withConfigFile ( file ) )
2019-10-15 16:30:06 +02:00
// wait for traefik
2024-01-09 17:00:07 +01:00
err := try . GetRequest ( "http://127.0.0.1:8080/api/rawdata" , time . Second , try . BodyContains ( "basic-auth" ) )
require . NoError ( s . T ( ) , err )
2019-10-15 16:30:06 +02:00
err = try . GetRequest ( "http://127.0.0.1:8000/auth" , 500 * time . Millisecond , try . StatusCodeIs ( http . StatusUnauthorized ) )
2024-01-09 17:00:07 +01:00
require . NoError ( s . T ( ) , err )
2019-10-15 16:30:06 +02:00
2024-01-09 17:00:07 +01:00
err = try . GetRequest ( "http://" + s . tracerJaegerIP + ":16686/api/traces?service=tracing" , 20 * time . Second , try . BodyContains ( "EntryPoint web" , "basic-auth@file" ) )
require . NoError ( s . T ( ) , err )
2019-10-15 16:30:06 +02:00
}
2024-01-09 17:00:07 +01:00
func ( s * TracingSuite ) TestJaegerCustomHeader ( ) {
s . startJaeger ( )
// defer s.composeStop(c, "jaeger")
2021-11-25 10:10:06 +00:00
2024-01-09 17:00:07 +01:00
file := s . adaptFile ( "fixtures/tracing/simple-jaeger.toml" , TracingTemplate {
2021-11-25 10:10:06 +00:00
WhoamiIP : s . whoamiIP ,
WhoamiPort : s . whoamiPort ,
2024-01-09 17:00:07 +01:00
IP : s . tracerJaegerIP ,
2019-10-15 16:30:06 +02:00
TraceContextHeaderName : "powpow" ,
2019-06-28 00:16:04 +02:00
} )
2024-01-09 17:00:07 +01:00
s . traefikCmd ( withConfigFile ( file ) )
2019-06-28 00:16:04 +02:00
// wait for traefik
2024-01-09 17:00:07 +01:00
err := try . GetRequest ( "http://127.0.0.1:8080/api/rawdata" , time . Second , try . BodyContains ( "basic-auth" ) )
require . NoError ( s . T ( ) , err )
2019-06-28 00:16:04 +02:00
err = try . GetRequest ( "http://127.0.0.1:8000/auth" , 500 * time . Millisecond , try . StatusCodeIs ( http . StatusUnauthorized ) )
2024-01-09 17:00:07 +01:00
require . NoError ( s . T ( ) , err )
2019-06-28 00:16:04 +02:00
2024-01-09 17:00:07 +01:00
err = try . GetRequest ( "http://" + s . tracerJaegerIP + ":16686/api/traces?service=tracing" , 20 * time . Second , try . BodyContains ( "EntryPoint web" , "basic-auth@file" ) )
require . NoError ( s . T ( ) , err )
2018-01-25 12:00:05 +01:00
}
2019-07-15 08:52:04 -04:00
2024-01-09 17:00:07 +01:00
func ( s * TracingSuite ) TestJaegerAuthCollector ( ) {
s . startJaeger ( )
// defer s.composeStop(c, "jaeger")
2021-11-25 10:10:06 +00:00
2024-01-09 17:00:07 +01:00
file := s . adaptFile ( "fixtures/tracing/simple-jaeger-collector.toml" , TracingTemplate {
2021-11-25 10:10:06 +00:00
WhoamiIP : s . whoamiIP ,
WhoamiPort : s . whoamiPort ,
2024-01-09 17:00:07 +01:00
IP : s . tracerJaegerIP ,
2019-07-15 08:52:04 -04:00
} )
2024-01-09 17:00:07 +01:00
s . traefikCmd ( withConfigFile ( file ) )
2019-07-15 08:52:04 -04:00
// wait for traefik
2024-01-09 17:00:07 +01:00
err := try . GetRequest ( "http://127.0.0.1:8080/api/rawdata" , time . Second , try . BodyContains ( "basic-auth" ) )
require . NoError ( s . T ( ) , err )
2019-07-15 08:52:04 -04:00
err = try . GetRequest ( "http://127.0.0.1:8000/auth" , 500 * time . Millisecond , try . StatusCodeIs ( http . StatusUnauthorized ) )
2024-01-09 17:00:07 +01:00
require . NoError ( s . T ( ) , err )
2019-07-15 08:52:04 -04:00
2024-01-09 17:00:07 +01:00
err = try . GetRequest ( "http://" + s . tracerJaegerIP + ":16686/api/traces?service=tracing" , 20 * time . Second , try . BodyContains ( "EntryPoint web" , "basic-auth@file" ) )
require . NoError ( s . T ( ) , err )
2019-07-15 08:52:04 -04:00
}