2015-09-27 13:59:51 +00:00
|
|
|
// This is the main file that sets up integration tests using go-check.
|
2017-07-06 14:28:13 +00:00
|
|
|
package integration
|
2015-09-27 13:59:51 +00:00
|
|
|
|
|
|
|
import (
|
2017-05-17 13:22:44 +00:00
|
|
|
"bytes"
|
2017-10-13 09:08:03 +00:00
|
|
|
"flag"
|
2015-09-27 13:59:51 +00:00
|
|
|
"fmt"
|
2015-09-28 20:37:19 +00:00
|
|
|
"io/ioutil"
|
2016-12-12 17:30:31 +00:00
|
|
|
"net"
|
2015-09-28 20:37:19 +00:00
|
|
|
"os"
|
|
|
|
"os/exec"
|
|
|
|
"path/filepath"
|
2015-09-27 13:59:51 +00:00
|
|
|
"testing"
|
2015-09-28 20:37:19 +00:00
|
|
|
"text/template"
|
2015-09-27 13:59:51 +00:00
|
|
|
|
2017-09-13 08:34:04 +00:00
|
|
|
"github.com/containous/traefik/log"
|
2016-04-02 10:40:21 +00:00
|
|
|
"github.com/go-check/check"
|
2016-07-21 14:19:51 +00:00
|
|
|
compose "github.com/libkermit/compose/check"
|
2015-09-27 13:59:51 +00:00
|
|
|
checker "github.com/vdemeester/shakers"
|
|
|
|
)
|
|
|
|
|
2017-10-13 09:08:03 +00:00
|
|
|
var integration = flag.Bool("integration", false, "run integration tests")
|
2017-10-30 09:02:03 +00:00
|
|
|
var container = flag.Bool("container", false, "run container integration tests")
|
|
|
|
var host = flag.Bool("host", false, "run host integration tests")
|
2018-06-27 13:08:05 +00:00
|
|
|
var showLog = flag.Bool("tlog", false, "always show Traefik logs")
|
2017-10-13 09:08:03 +00:00
|
|
|
|
2015-09-27 13:59:51 +00:00
|
|
|
func Test(t *testing.T) {
|
|
|
|
check.TestingT(t)
|
|
|
|
}
|
|
|
|
|
|
|
|
func init() {
|
2017-10-13 09:08:03 +00:00
|
|
|
flag.Parse()
|
|
|
|
if !*integration {
|
|
|
|
log.Info("Integration tests disabled.")
|
|
|
|
return
|
|
|
|
}
|
|
|
|
|
2017-10-30 09:02:03 +00:00
|
|
|
if *container {
|
|
|
|
// tests launched from a container
|
|
|
|
check.Suite(&AccessLogSuite{})
|
|
|
|
check.Suite(&AcmeSuite{})
|
|
|
|
check.Suite(&ConstraintSuite{})
|
|
|
|
check.Suite(&ConsulCatalogSuite{})
|
|
|
|
check.Suite(&ConsulSuite{})
|
2018-04-16 16:14:04 +00:00
|
|
|
check.Suite(&DockerComposeSuite{})
|
2017-10-30 09:02:03 +00:00
|
|
|
check.Suite(&DockerSuite{})
|
|
|
|
check.Suite(&DynamoDBSuite{})
|
|
|
|
check.Suite(&EtcdSuite{})
|
2017-11-17 16:22:03 +00:00
|
|
|
check.Suite(&ErrorPagesSuite{})
|
2017-10-30 09:02:03 +00:00
|
|
|
check.Suite(&EurekaSuite{})
|
|
|
|
check.Suite(&FileSuite{})
|
|
|
|
check.Suite(&GRPCSuite{})
|
|
|
|
check.Suite(&HealthCheckSuite{})
|
2018-07-03 14:44:05 +00:00
|
|
|
check.Suite(&HostResolverSuite{})
|
2017-10-30 09:02:03 +00:00
|
|
|
check.Suite(&HTTPSSuite{})
|
|
|
|
check.Suite(&LogRotationSuite{})
|
|
|
|
check.Suite(&MarathonSuite{})
|
2018-07-03 21:42:03 +00:00
|
|
|
check.Suite(&MarathonSuite15{})
|
2017-10-30 09:02:03 +00:00
|
|
|
check.Suite(&MesosSuite{})
|
|
|
|
check.Suite(&RateLimitSuite{})
|
2018-01-26 17:22:03 +00:00
|
|
|
check.Suite(&RetrySuite{})
|
2017-10-30 09:02:03 +00:00
|
|
|
check.Suite(&SimpleSuite{})
|
2018-08-29 09:36:03 +00:00
|
|
|
check.Suite(&TLSClientHeadersSuite{})
|
2017-10-30 09:02:03 +00:00
|
|
|
check.Suite(&TimeoutSuite{})
|
2018-01-25 11:00:05 +00:00
|
|
|
check.Suite(&TracingSuite{})
|
2017-10-30 09:02:03 +00:00
|
|
|
check.Suite(&WebsocketSuite{})
|
|
|
|
}
|
|
|
|
if *host {
|
|
|
|
// tests launched from the host
|
|
|
|
check.Suite(&ProxyProtocolSuite{})
|
2017-11-17 16:22:03 +00:00
|
|
|
check.Suite(&Etcd3Suite{})
|
2017-10-30 09:02:03 +00:00
|
|
|
}
|
2015-09-27 13:59:51 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
var traefikBinary = "../dist/traefik"
|
|
|
|
|
|
|
|
type BaseSuite struct {
|
2016-03-27 17:58:08 +00:00
|
|
|
composeProject *compose.Project
|
2015-09-27 13:59:51 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
func (s *BaseSuite) TearDownSuite(c *check.C) {
|
|
|
|
// shutdown and delete compose project
|
|
|
|
if s.composeProject != nil {
|
2016-04-02 10:40:21 +00:00
|
|
|
s.composeProject.Stop(c)
|
2015-09-27 13:59:51 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
func (s *BaseSuite) createComposeProject(c *check.C, name string) {
|
2016-03-27 17:58:08 +00:00
|
|
|
projectName := fmt.Sprintf("integration-test-%s", name)
|
|
|
|
composeFile := fmt.Sprintf("resources/compose/%s.yml", name)
|
2016-12-12 17:30:31 +00:00
|
|
|
|
|
|
|
addrs, err := net.InterfaceAddrs()
|
|
|
|
c.Assert(err, checker.IsNil)
|
|
|
|
for _, addr := range addrs {
|
|
|
|
ip, _, err := net.ParseCIDR(addr.String())
|
|
|
|
c.Assert(err, checker.IsNil)
|
|
|
|
if !ip.IsLoopback() && ip.To4() != nil {
|
|
|
|
os.Setenv("DOCKER_HOST_IP", ip.String())
|
|
|
|
break
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2016-04-02 10:40:21 +00:00
|
|
|
s.composeProject = compose.CreateProject(c, projectName, composeFile)
|
2015-09-27 13:59:51 +00:00
|
|
|
}
|
2015-09-28 20:37:19 +00:00
|
|
|
|
2017-07-10 12:58:31 +00:00
|
|
|
func withConfigFile(file string) string {
|
|
|
|
return "--configFile=" + file
|
2017-05-17 13:22:44 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
func (s *BaseSuite) cmdTraefik(args ...string) (*exec.Cmd, *bytes.Buffer) {
|
|
|
|
cmd := exec.Command(traefikBinary, args...)
|
|
|
|
var out bytes.Buffer
|
|
|
|
cmd.Stdout = &out
|
|
|
|
cmd.Stderr = &out
|
|
|
|
return cmd, &out
|
|
|
|
}
|
|
|
|
|
2017-09-13 08:34:04 +00:00
|
|
|
func (s *BaseSuite) traefikCmd(args ...string) (*exec.Cmd, func(*check.C)) {
|
|
|
|
cmd, out := s.cmdTraefik(args...)
|
|
|
|
return cmd, func(c *check.C) {
|
2018-06-27 13:08:05 +00:00
|
|
|
if c.Failed() || *showLog {
|
2017-09-13 08:34:04 +00:00
|
|
|
s.displayTraefikLog(c, out)
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2017-05-17 13:22:44 +00:00
|
|
|
func (s *BaseSuite) displayTraefikLog(c *check.C, output *bytes.Buffer) {
|
|
|
|
if output == nil || output.Len() == 0 {
|
2017-09-13 08:34:04 +00:00
|
|
|
log.Printf("%s: No Traefik logs.", c.TestName())
|
2017-05-17 13:22:44 +00:00
|
|
|
} else {
|
2017-09-13 08:34:04 +00:00
|
|
|
log.Printf("%s: Traefik logs: ", c.TestName())
|
|
|
|
log.Println(output.String())
|
2017-05-17 13:22:44 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2015-09-28 20:37:19 +00:00
|
|
|
func (s *BaseSuite) adaptFileForHost(c *check.C, path string) string {
|
|
|
|
dockerHost := os.Getenv("DOCKER_HOST")
|
|
|
|
if dockerHost == "" {
|
|
|
|
// Default docker socket
|
|
|
|
dockerHost = "unix:///var/run/docker.sock"
|
|
|
|
}
|
2016-04-27 23:43:43 +00:00
|
|
|
tempObjects := struct{ DockerHost string }{dockerHost}
|
|
|
|
return s.adaptFile(c, path, tempObjects)
|
|
|
|
}
|
2015-09-28 20:37:19 +00:00
|
|
|
|
2016-04-27 23:43:43 +00:00
|
|
|
func (s *BaseSuite) adaptFile(c *check.C, path string, tempObjects interface{}) string {
|
2015-09-28 20:37:19 +00:00
|
|
|
// Load file
|
|
|
|
tmpl, err := template.ParseFiles(path)
|
|
|
|
c.Assert(err, checker.IsNil)
|
|
|
|
|
|
|
|
folder, prefix := filepath.Split(path)
|
|
|
|
tmpFile, err := ioutil.TempFile(folder, prefix)
|
|
|
|
c.Assert(err, checker.IsNil)
|
|
|
|
defer tmpFile.Close()
|
|
|
|
|
2016-04-27 23:43:43 +00:00
|
|
|
err = tmpl.ExecuteTemplate(tmpFile, prefix, tempObjects)
|
2015-09-28 20:37:19 +00:00
|
|
|
c.Assert(err, checker.IsNil)
|
|
|
|
err = tmpFile.Sync()
|
|
|
|
|
|
|
|
c.Assert(err, checker.IsNil)
|
|
|
|
|
|
|
|
return tmpFile.Name()
|
|
|
|
}
|