hs-test: abstract away topology from test cases

Definition of shared volumes and containers has been moved
to yaml files to be together with network topology.
Containers are automatically run at the beginning of each test case
and stopped afterward.

Type: test
Signed-off-by: Maros Ondrejicka <maros.ondrejicka@pantheon.tech>
Change-Id: I264cbb4f1355f8bd7aade221e9609fb5b9bd693e
This commit is contained in:
Maros Ondrejicka
2022-12-14 16:30:04 +01:00
committed by Florin Coras
parent aff4d320f0
commit db823ed6e9
22 changed files with 491 additions and 428 deletions

View File

@@ -3,26 +3,43 @@ package main
import (
"fmt"
"testing"
"time"
"io/ioutil"
"github.com/edwarnicke/exechelper"
"github.com/stretchr/testify/assert"
"github.com/stretchr/testify/suite"
"gopkg.in/yaml.v3"
)
type HstSuite struct {
suite.Suite
teardownSuite func()
containers []*Container
containers map[string]*Container
volumes []string
}
func (s *HstSuite) TearDownSuite() {
s.teardownSuite()
s.StopContainers()
}
func (s *HstSuite) TearDownTest() {
s.ResetContainers()
s.RemoveVolumes()
}
func (s *HstSuite) SetupTest() {
for _, volume := range s.volumes {
cmd := "docker volume create --name=" + volume
fmt.Println(cmd)
exechelper.Run(cmd)
}
for _, container := range s.containers {
if container.isOptional == false {
container.run()
}
}
}
func (s *HstSuite) hstFail() {
s.T().FailNow()
}
@@ -63,20 +80,7 @@ func (s *HstSuite) assertNotContains(testString, contains interface{}, msgAndArg
}
}
func (s *HstSuite) NewContainer(name string) (*Container, error) {
if name == "" {
return nil, fmt.Errorf("creating container failed: name must not be blank")
}
container := new(Container)
container.name = name
s.containers = append(s.containers, container)
return container, nil
}
func (s *HstSuite) StopContainers() {
func (s *HstSuite) ResetContainers() {
for _, container := range s.containers {
container.stop()
}
@@ -94,39 +98,43 @@ func (s *HstSuite) NewVolume(name string) error {
func (s *HstSuite) RemoveVolumes() {
for _, volumeName := range s.volumes {
exechelper.Run("docker volume rm " + volumeName)
cmd := "docker volume rm " + volumeName
exechelper.Run(cmd)
}
}
type TapSuite struct {
HstSuite
func (s *HstSuite) getContainerByName(name string) *Container {
return s.containers[name]
}
func (s *TapSuite) SetupSuite() {
time.Sleep(1 * time.Second)
s.teardownSuite = setupSuite(&s.Suite, "tap")
}
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)
}
type VethsSuite struct {
HstSuite
}
for _, elem := range yamlTopo.Volumes {
s.volumes = append(s.volumes, elem)
}
func (s *VethsSuite) SetupSuite() {
time.Sleep(1 * time.Second)
s.teardownSuite = setupSuite(&s.Suite, "2peerVeth")
}
type NsSuite struct {
HstSuite
}
func (s *NsSuite) SetupSuite() {
s.teardownSuite = setupSuite(&s.Suite, "ns")
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.containers[newContainer.name] = newContainer
}
}
func setupSuite(s *suite.Suite, topologyName string) func() {
t := s.T()
topology, err := LoadTopology(TopologyDir, topologyName)
topology, err := LoadTopology(NetworkTopologyDir, topologyName)
if err != nil {
t.Fatalf("error on loading topology '%s': %v", topologyName, err)
}