2017-09-09 14:36:03 +03:00
package integration
import (
"net/http"
"os"
"time"
"github.com/containous/traefik/integration/try"
"github.com/go-check/check"
checker "github.com/vdemeester/shakers"
)
type RateLimitSuite struct {
BaseSuite
ServerIP string
}
func ( s * RateLimitSuite ) SetUpSuite ( c * check . C ) {
s . createComposeProject ( c , "ratelimit" )
s . composeProject . Start ( c )
2018-02-21 18:28:03 +03:00
s . ServerIP = s . composeProject . Container ( c , "whoami1" ) . NetworkSettings . IPAddress
2017-09-09 14:36:03 +03:00
}
func ( s * RateLimitSuite ) TestSimpleConfiguration ( c * check . C ) {
file := s . adaptFile ( c , "fixtures/ratelimit/simple.toml" , struct {
Server1 string
} { s . ServerIP } )
defer os . Remove ( file )
cmd , _ := s . cmdTraefik ( withConfigFile ( file ) )
err := cmd . Start ( )
c . Assert ( err , checker . IsNil )
defer cmd . Process . Kill ( )
err = try . GetRequest ( "http://127.0.0.1:80/" , 500 * time . Millisecond , try . StatusCodeIs ( http . StatusOK ) )
c . Assert ( err , checker . IsNil )
err = try . GetRequest ( "http://127.0.0.1:80/" , 500 * time . Millisecond , try . StatusCodeIs ( http . StatusOK ) )
c . Assert ( err , checker . IsNil )
err = try . GetRequest ( "http://127.0.0.1:80/" , 500 * time . Millisecond , try . StatusCodeIs ( http . StatusTooManyRequests ) )
c . Assert ( err , checker . IsNil )
// 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:80/" , 500 * time . Millisecond , try . StatusCodeIs ( http . StatusOK ) )
c . Assert ( err , checker . IsNil )
// 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:80/" , 500 * time . Millisecond , try . StatusCodeIs ( http . StatusOK ) )
c . Assert ( err , checker . IsNil )
time . Sleep ( 3 * time . Second )
err = try . GetRequest ( "http://127.0.0.1:80/" , 500 * time . Millisecond , try . StatusCodeIs ( http . StatusOK ) )
c . Assert ( err , checker . IsNil )
time . Sleep ( 3 * time . Second )
err = try . GetRequest ( "http://127.0.0.1:80/" , 500 * time . Millisecond , try . StatusCodeIs ( http . StatusTooManyRequests ) )
c . Assert ( err , checker . IsNil )
}