2018-01-26 20:22:03 +03:00
package integration
import (
"net/http"
"os"
"time"
"github.com/go-check/check"
2018-08-29 12:58:03 +03:00
"github.com/gorilla/websocket"
2020-09-16 16:46:04 +03:00
"github.com/traefik/traefik/v2/integration/try"
2018-01-26 20:22:03 +03:00
checker "github.com/vdemeester/shakers"
)
2021-11-25 13:10:06 +03:00
type RetrySuite struct {
BaseSuite
whoamiIP string
}
2018-01-26 20:22:03 +03:00
func ( s * RetrySuite ) SetUpSuite ( c * check . C ) {
s . createComposeProject ( c , "retry" )
2021-11-25 13:10:06 +03:00
s . composeUp ( c )
s . whoamiIP = s . getComposeServiceIP ( c , "whoami" )
2018-01-26 20:22:03 +03:00
}
func ( s * RetrySuite ) TestRetry ( c * check . C ) {
2021-11-25 13:10:06 +03:00
file := s . adaptFile ( c , "fixtures/retry/simple.toml" , struct { WhoamiIP string } { s . whoamiIP } )
2018-01-26 20:22:03 +03:00
defer os . Remove ( file )
cmd , display := s . traefikCmd ( withConfigFile ( file ) )
defer display ( c )
err := cmd . Start ( )
c . Assert ( err , checker . IsNil )
2020-10-09 10:32:03 +03:00
defer s . killCmd ( cmd )
2018-01-26 20:22:03 +03:00
2019-05-16 11:58:06 +03:00
err = try . GetRequest ( "http://127.0.0.1:8080/api/rawdata" , 60 * time . Second , try . BodyContains ( "PathPrefix(`/`)" ) )
2018-01-26 20:22:03 +03:00
c . Assert ( err , checker . IsNil )
response , err := http . Get ( "http://127.0.0.1:8000/" )
c . Assert ( err , checker . IsNil )
2022-09-14 15:42:08 +03:00
// The test only verifies that the retry middleware makes sure that the working service is eventually reached.
2018-01-26 20:22:03 +03:00
c . Assert ( response . StatusCode , checker . Equals , http . StatusOK )
2020-11-05 18:14:04 +03:00
}
func ( s * RetrySuite ) TestRetryBackoff ( c * check . C ) {
2021-11-25 13:10:06 +03:00
file := s . adaptFile ( c , "fixtures/retry/backoff.toml" , struct { WhoamiIP string } { s . whoamiIP } )
2020-11-05 18:14:04 +03:00
defer os . Remove ( file )
cmd , display := s . traefikCmd ( withConfigFile ( file ) )
defer display ( c )
err := cmd . Start ( )
c . Assert ( err , checker . IsNil )
defer s . killCmd ( cmd )
err = try . GetRequest ( "http://127.0.0.1:8080/api/rawdata" , 60 * time . Second , try . BodyContains ( "PathPrefix(`/`)" ) )
c . Assert ( err , checker . IsNil )
response , err := http . Get ( "http://127.0.0.1:8000/" )
c . Assert ( err , checker . IsNil )
2022-09-14 15:42:08 +03:00
// The test only verifies that the retry middleware allows finally to reach the working service.
2020-11-05 18:14:04 +03:00
c . Assert ( response . StatusCode , checker . Equals , http . StatusOK )
2018-01-26 20:22:03 +03:00
}
2018-08-29 12:58:03 +03:00
func ( s * RetrySuite ) TestRetryWebsocket ( c * check . C ) {
2021-11-25 13:10:06 +03:00
file := s . adaptFile ( c , "fixtures/retry/simple.toml" , struct { WhoamiIP string } { s . whoamiIP } )
2018-08-29 12:58:03 +03:00
defer os . Remove ( file )
cmd , display := s . traefikCmd ( withConfigFile ( file ) )
defer display ( c )
err := cmd . Start ( )
c . Assert ( err , checker . IsNil )
2020-10-09 10:32:03 +03:00
defer s . killCmd ( cmd )
2018-08-29 12:58:03 +03:00
2019-05-16 11:58:06 +03:00
err = try . GetRequest ( "http://127.0.0.1:8080/api/rawdata" , 60 * time . Second , try . BodyContains ( "PathPrefix(`/`)" ) )
2018-08-29 12:58:03 +03:00
c . Assert ( err , checker . IsNil )
2022-09-14 15:42:08 +03:00
// The test only verifies that the retry middleware makes sure that the working service is eventually reached.
2018-08-29 12:58:03 +03:00
_ , response , err := websocket . DefaultDialer . Dial ( "ws://127.0.0.1:8000/echo" , nil )
c . Assert ( err , checker . IsNil )
c . Assert ( response . StatusCode , checker . Equals , http . StatusSwitchingProtocols )
2022-09-14 15:42:08 +03:00
// The test verifies a second time that the working service is eventually reached.
2018-08-29 12:58:03 +03:00
_ , response , err = websocket . DefaultDialer . Dial ( "ws://127.0.0.1:8000/echo" , nil )
c . Assert ( err , checker . IsNil )
c . Assert ( response . StatusCode , checker . Equals , http . StatusSwitchingProtocols )
}