package main import ( "io/ioutil" "os" "testing" "github.com/edwarnicke/exechelper" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/suite" "gopkg.in/yaml.v3" ) func IsPersistent() bool { return os.Getenv("HST_PERSIST") == "1" } func IsVerbose() bool { return os.Getenv("HST_VERBOSE") == "1" } type HstSuite struct { suite.Suite teardownSuite func() containers map[string]*Container volumes []string } func (s *HstSuite) TearDownSuite() { s.teardownSuite() } func (s *HstSuite) TearDownTest() { if IsPersistent() { return } s.ResetContainers() s.RemoveVolumes() } func (s *HstSuite) SetupTest() { for _, volume := range s.volumes { cmd := "docker volume create --name=" + volume s.log(cmd) exechelper.Run(cmd) } for _, container := range s.containers { if container.isOptional == false { container.run() } } } func (s *HstSuite) hstFail() { s.T().FailNow() } func (s *HstSuite) assertNil(object interface{}, msgAndArgs ...interface{}) { if !assert.Nil(s.T(), object, msgAndArgs...) { s.hstFail() } } func (s *HstSuite) assertNotNil(object interface{}, msgAndArgs ...interface{}) { if !assert.NotNil(s.T(), object, msgAndArgs...) { s.hstFail() } } func (s *HstSuite) assertEqual(expected, actual interface{}, msgAndArgs ...interface{}) { if !assert.Equal(s.T(), expected, actual, msgAndArgs...) { s.hstFail() } } func (s *HstSuite) assertNotEqual(expected, actual interface{}, msgAndArgs ...interface{}) { if !assert.NotEqual(s.T(), expected, actual, msgAndArgs...) { s.hstFail() } } func (s *HstSuite) assertContains(testString, contains interface{}, msgAndArgs ...interface{}) { if !assert.Contains(s.T(), testString, contains, msgAndArgs...) { s.hstFail() } } func (s *HstSuite) assertNotContains(testString, contains interface{}, msgAndArgs ...interface{}) { if !assert.NotContains(s.T(), testString, contains, msgAndArgs...) { s.hstFail() } } func (s *HstSuite) log(args ...any) { if IsVerbose() { s.T().Log(args...) } } func (s *HstSuite) skip(args ...any) { s.log(args...) s.T().SkipNow() } func (s *HstSuite) ResetContainers() { for _, container := range s.containers { container.stop() } } func (s *HstSuite) RemoveVolumes() { for _, volumeName := range s.volumes { cmd := "docker volume rm " + volumeName exechelper.Run(cmd) } } func (s *HstSuite) getContainerByName(name string) *Container { return s.containers[name] } func (s *HstSuite) loadContainerTopology(topologyName string) { data, err := ioutil.ReadFile(ContainerTopologyDir + topologyName + ".yaml") if err != nil { s.T().Fatalf("read error: %v", err) } var yamlTopo YamlTopology err = yaml.Unmarshal(data, &yamlTopo) if err != nil { s.T().Fatalf("unmarshal error: %v", err) } for _, elem := range yamlTopo.Volumes { volumeMap := elem["volume"].(VolumeConfig) hostDir := volumeMap["host-dir"].(string) s.volumes = append(s.volumes, hostDir) } s.containers = make(map[string]*Container) for _, elem := range yamlTopo.Containers { newContainer, err := NewContainer(elem) if err != nil { s.T().Fatalf("config error: %v", err) } s.log(newContainer.getRunCommand()) s.containers[newContainer.name] = newContainer } } func setupSuite(s *suite.Suite, topologyName string) func() { t := s.T() topology, err := LoadTopology(NetworkTopologyDir, topologyName) if err != nil { t.Fatalf("error on loading topology '%s': %v", topologyName, err) } err = topology.Configure() if err != nil { t.Fatalf("failed to configure %s: %v", topologyName, err) } return func() { if IsPersistent() { return } topology.Unconfigure() } } func TestTapSuite(t *testing.T) { var m TapSuite suite.Run(t, &m) } func TestNs(t *testing.T) { var m NsSuite suite.Run(t, &m) } func TestVeths(t *testing.T) { var m VethsSuite suite.Run(t, &m) } func TestNoTopo(t *testing.T) { var m NoTopoSuite suite.Run(t, &m) }