test: restructure test packages

Signed-off-by: Steffen Vogel <post@steffenvogel.de>
This commit is contained in:
Steffen Vogel
2022-08-31 14:21:54 +02:00
parent 82ca0f4146
commit ef8be95fcc
52 changed files with 227 additions and 105 deletions

View File

@@ -1,5 +1,6 @@
--- ---
ignore: ignore:
# Auto-generated files
- pkg/proto/**/*.pb.go - pkg/proto/**/*.pb.go
- pkg/signaling/k8s/apis/**/* - pkg/signaling/k8s/apis/**/*
- pkg/signaling/k8s/client/**/* - pkg/signaling/k8s/client/**/*

View File

@@ -141,9 +141,9 @@ jobs:
if: ${{ matrix.target_arch == matrix.host_arch && matrix.target_os == matrix.host_os && matrix.host_os == 'windows' }} if: ${{ matrix.target_arch == matrix.host_arch && matrix.target_os == matrix.host_os && matrix.host_os == 'windows' }}
run: make tests GINKGO_EXTRA_OPTS="--label-filter=!broken-on-windows" run: make tests GINKGO_EXTRA_OPTS="--label-filter=!broken-on-windows"
- name: Run integration tests - name: Run end-to-end tests
if: ${{ matrix.target_arch == matrix.host_arch && matrix.target_os == matrix.host_os && matrix.host_os == 'linux' }} if: ${{ matrix.target_arch == matrix.host_arch && matrix.target_os == matrix.host_os && matrix.host_os == 'linux' }}
run: sudo --preserve-env env "PATH=$PATH" make tests-integration run: sudo --preserve-env env "PATH=$PATH" make tests-e2e
- name: Upload logs an packet captures as artifacts - name: Upload logs an packet captures as artifacts
if: ${{ always() && matrix.target_arch == matrix.host_arch && matrix.target_os == matrix.host_os && matrix.host_os == 'linux' }} if: ${{ always() && matrix.target_arch == matrix.host_arch && matrix.target_os == matrix.host_os && matrix.host_os == 'linux' }}

2
.gitignore vendored
View File

@@ -7,4 +7,4 @@ dist/
*.test *.test
*.out.* *.out.*
lcov.info lcov.info
test/logs/ test/e2e/logs/

View File

@@ -9,9 +9,9 @@ LDFLAGS = -X riasc.eu/wice/pkg/util/buildinfo.Version=$(shell git describe --tag
-X riasc.eu/wice/pkg/util/buildinfo.Date=$(shell date -Iseconds) \ -X riasc.eu/wice/pkg/util/buildinfo.Date=$(shell date -Iseconds) \
-X riasc.eu/wice/pkg/util/buildinfo.BuiltBy=Makefile \ -X riasc.eu/wice/pkg/util/buildinfo.BuiltBy=Makefile \
PKGS ?= ./cmd/... ./pkg/... PKGS ?= ./cmd/... ./pkg/... ./test
ifeq ($(GOOS),linux) ifeq ($(GOOS),linux)
PKGS += ./test/... PKGS += ./test/e2e/...
endif endif
GINKGO_OPTS = --compilers=2 \ GINKGO_OPTS = --compilers=2 \
@@ -34,9 +34,9 @@ wice:
tests: tests:
ginkgo run $(GINKGO_OPTS) --coverprofile=coverprofile.out ./pkg/... ginkgo run $(GINKGO_OPTS) --coverprofile=coverprofile.out ./pkg/...
tests-integration: tests-e2e:
mkdir -p test/logs mkdir -p test/logs
ginkgo run $(GINKGO_OPTS) --output-dir=./test/logs --coverprofile=coverprofile_integration.out ./test ginkgo run $(GINKGO_OPTS) --output-dir=./test/e2e/logs --coverprofile=coverprofile_integration.out ./test/e2e
coverprofile_merged.out: $(shell find . -name "*.out" -type f) coverprofile_merged.out: $(shell find . -name "*.out" -type f)
gocov-merger -o $@ $^ gocov-merger -o $@ $^

View File

@@ -13,7 +13,7 @@ import (
"github.com/pion/ice/v2" "github.com/pion/ice/v2"
"riasc.eu/wice/pkg/config" "riasc.eu/wice/pkg/config"
"riasc.eu/wice/pkg/test" "riasc.eu/wice/test"
icex "riasc.eu/wice/pkg/feat/epdisc/ice" icex "riasc.eu/wice/pkg/feat/epdisc/ice"
) )

View File

@@ -7,8 +7,8 @@ import (
. "github.com/onsi/ginkgo/v2" . "github.com/onsi/ginkgo/v2"
. "github.com/onsi/gomega" . "github.com/onsi/gomega"
"riasc.eu/wice/pkg/test"
"riasc.eu/wice/pkg/util" "riasc.eu/wice/pkg/util"
"riasc.eu/wice/test"
) )
func TestSuite(t *testing.T) { func TestSuite(t *testing.T) {

View File

@@ -6,7 +6,7 @@ import (
. "github.com/onsi/ginkgo/v2" . "github.com/onsi/ginkgo/v2"
. "github.com/onsi/gomega" . "github.com/onsi/gomega"
"riasc.eu/wice/pkg/crypto" "riasc.eu/wice/pkg/crypto"
"riasc.eu/wice/pkg/test" "riasc.eu/wice/test"
) )
func TestSuite(t *testing.T) { func TestSuite(t *testing.T) {

View File

@@ -5,7 +5,7 @@ import (
"net" "net"
"riasc.eu/wice/pkg/crypto" "riasc.eu/wice/pkg/crypto"
"riasc.eu/wice/pkg/test" "riasc.eu/wice/test"
. "github.com/onsi/ginkgo/v2" . "github.com/onsi/ginkgo/v2"
. "github.com/onsi/gomega" . "github.com/onsi/gomega"

View File

@@ -6,8 +6,8 @@ import (
. "github.com/onsi/ginkgo/v2" . "github.com/onsi/ginkgo/v2"
. "github.com/onsi/gomega" . "github.com/onsi/gomega"
"riasc.eu/wice/pkg/test"
"riasc.eu/wice/pkg/util" "riasc.eu/wice/pkg/util"
"riasc.eu/wice/test"
) )
func TestSuite(t *testing.T) { func TestSuite(t *testing.T) {

View File

@@ -5,7 +5,7 @@ import (
. "github.com/onsi/ginkgo/v2" . "github.com/onsi/ginkgo/v2"
. "github.com/onsi/gomega" . "github.com/onsi/gomega"
"riasc.eu/wice/pkg/test" "riasc.eu/wice/test"
) )
func TestSuite(t *testing.T) { func TestSuite(t *testing.T) {

View File

@@ -25,6 +25,8 @@ func TestSuite(t *testing.T) {
RunSpecs(t, "Logging Suite") RunSpecs(t, "Logging Suite")
} }
// TODO: This test is currently broken on Windows dues:
// https://github.com/uber-go/zap/issues/621
var _ = Context("log", Label("broken-on-windows"), func() { var _ = Context("log", Label("broken-on-windows"), func() {
var logger *zap.Logger var logger *zap.Logger
var lvl zapcore.Level var lvl zapcore.Level

View File

@@ -5,7 +5,7 @@ import (
. "github.com/onsi/ginkgo/v2" . "github.com/onsi/ginkgo/v2"
. "github.com/onsi/gomega" . "github.com/onsi/gomega"
"riasc.eu/wice/pkg/test" "riasc.eu/wice/test"
) )
func TestSuite(t *testing.T) { func TestSuite(t *testing.T) {

View File

@@ -6,7 +6,7 @@ import (
"google.golang.org/protobuf/proto" "google.golang.org/protobuf/proto"
"riasc.eu/wice/pkg/crypto" "riasc.eu/wice/pkg/crypto"
"riasc.eu/wice/pkg/test" "riasc.eu/wice/test"
protoepdisc "riasc.eu/wice/pkg/proto/feat/epdisc" protoepdisc "riasc.eu/wice/pkg/proto/feat/epdisc"
signalingproto "riasc.eu/wice/pkg/proto/signaling" signalingproto "riasc.eu/wice/pkg/proto/signaling"

View File

@@ -8,7 +8,7 @@ import (
. "github.com/onsi/ginkgo/v2" . "github.com/onsi/ginkgo/v2"
. "github.com/onsi/gomega" . "github.com/onsi/gomega"
"riasc.eu/wice/pkg/signaling/grpc" "riasc.eu/wice/pkg/signaling/grpc"
"riasc.eu/wice/pkg/test" "riasc.eu/wice/test"
) )
func TestSuite(t *testing.T) { func TestSuite(t *testing.T) {

View File

@@ -7,7 +7,7 @@ import (
. "github.com/onsi/ginkgo/v2" . "github.com/onsi/ginkgo/v2"
. "github.com/onsi/gomega" . "github.com/onsi/gomega"
_ "riasc.eu/wice/pkg/signaling/inprocess" _ "riasc.eu/wice/pkg/signaling/inprocess"
"riasc.eu/wice/pkg/test" "riasc.eu/wice/test"
) )
func TestSuite(t *testing.T) { func TestSuite(t *testing.T) {

View File

@@ -13,7 +13,7 @@ import (
"k8s.io/client-go/rest" "k8s.io/client-go/rest"
"k8s.io/client-go/tools/clientcmd" "k8s.io/client-go/tools/clientcmd"
"k8s.io/client-go/tools/clientcmd/api" "k8s.io/client-go/tools/clientcmd/api"
"riasc.eu/wice/pkg/test" "riasc.eu/wice/test"
"sigs.k8s.io/controller-runtime/pkg/envtest" "sigs.k8s.io/controller-runtime/pkg/envtest"
"sigs.k8s.io/controller-runtime/pkg/log" "sigs.k8s.io/controller-runtime/pkg/log"
) )

View File

@@ -5,7 +5,7 @@ import (
. "github.com/onsi/ginkgo/v2" . "github.com/onsi/ginkgo/v2"
. "github.com/onsi/gomega" . "github.com/onsi/gomega"
"riasc.eu/wice/pkg/test" "riasc.eu/wice/test"
) )
func TestSuite(t *testing.T) { func TestSuite(t *testing.T) {

13
pkg/util/json.go Normal file
View File

@@ -0,0 +1,13 @@
package util
import "encoding/json"
func ReIndentJSON(j []byte, prefix, indent string) ([]byte, error) {
u := map[string]any{}
if err := json.Unmarshal(j, &u); err != nil {
return nil, err
}
return json.MarshalIndent(u, prefix, indent)
}

View File

@@ -6,8 +6,8 @@ import (
. "github.com/onsi/ginkgo/v2" . "github.com/onsi/ginkgo/v2"
. "github.com/onsi/gomega" . "github.com/onsi/gomega"
"riasc.eu/wice/pkg/test"
"riasc.eu/wice/pkg/util" "riasc.eu/wice/pkg/util"
"riasc.eu/wice/test"
) )
func TestSuite(t *testing.T) { func TestSuite(t *testing.T) {

View File

@@ -14,10 +14,10 @@ import (
"riasc.eu/wice/pkg/core" "riasc.eu/wice/pkg/core"
"riasc.eu/wice/pkg/crypto" "riasc.eu/wice/pkg/crypto"
"riasc.eu/wice/pkg/device" "riasc.eu/wice/pkg/device"
"riasc.eu/wice/pkg/test"
"riasc.eu/wice/pkg/util" "riasc.eu/wice/pkg/util"
"riasc.eu/wice/pkg/watcher" "riasc.eu/wice/pkg/watcher"
"riasc.eu/wice/pkg/wg" "riasc.eu/wice/pkg/wg"
"riasc.eu/wice/test"
) )
func TestSuite(t *testing.T) { func TestSuite(t *testing.T) {

View File

@@ -5,7 +5,7 @@ import (
. "github.com/onsi/ginkgo/v2" . "github.com/onsi/ginkgo/v2"
. "github.com/onsi/gomega" . "github.com/onsi/gomega"
"riasc.eu/wice/pkg/test" "riasc.eu/wice/test"
) )
func TestSuite(t *testing.T) { func TestSuite(t *testing.T) {

View File

@@ -1,4 +1,4 @@
package test_test package e2e_test
import ( import (
"fmt" "fmt"
@@ -7,8 +7,8 @@ import (
. "github.com/onsi/gomega" . "github.com/onsi/gomega"
g "github.com/stv0g/gont/pkg" g "github.com/stv0g/gont/pkg"
gopt "github.com/stv0g/gont/pkg/options" gopt "github.com/stv0g/gont/pkg/options"
"riasc.eu/wice/test/nodes" "riasc.eu/wice/test/e2e/nodes"
wopt "riasc.eu/wice/test/nodes/options/wg" wopt "riasc.eu/wice/test/e2e/nodes/options/wg"
) )
/* Carrier Grade NAT setup with two relays and a single signaling server /* Carrier Grade NAT setup with two relays and a single signaling server
@@ -39,7 +39,7 @@ import (
* n1 n2 * n1 n2
* *
*/ */
var _ = Context("nat double", func() { var _ = Context("nat double: Carrier Grade NAT setup with two relays and a single signaling server", func() {
var ( var (
err error err error
@@ -221,7 +221,7 @@ var _ = Context("nat double", func() {
n.SignalingNodes = nodes.SignalingList{s1} n.SignalingNodes = nodes.SignalingList{s1}
}) })
Context("2-nodes", func() { Context("2-nodes: Two agents connected to lan1 and lan2", func() {
JustBeforeEach(func() { JustBeforeEach(func() {
n.Start() n.Start()
}) })
@@ -229,7 +229,7 @@ var _ = Context("nat double", func() {
n.ConnectivityTests() n.ConnectivityTests()
}) })
Context("3-nodes", func() { Context("3-nodes: Additional agent connected to lan2", func() {
JustBeforeEach(func() { JustBeforeEach(func() {
AddAgent(3, lan2) AddAgent(3, lan2)
@@ -239,7 +239,7 @@ var _ = Context("nat double", func() {
n.ConnectivityTests() n.ConnectivityTests()
}) })
Context("4-nodes", func() { Context("4-nodes: Additional agent connected to wan2", func() {
JustBeforeEach(func() { JustBeforeEach(func() {
AddAgent(3, lan2) AddAgent(3, lan2)
AddAgent(4, wan2) AddAgent(4, wan2)
@@ -250,7 +250,7 @@ var _ = Context("nat double", func() {
n.ConnectivityTests() n.ConnectivityTests()
}) })
Context("5-nodes", func() { Context("5-nodes: Additional agent connected to wan1", func() {
JustBeforeEach(func() { JustBeforeEach(func() {
AddAgent(3, lan2) AddAgent(3, lan2)
AddAgent(4, wan2) AddAgent(4, wan2)

View File

@@ -1,4 +1,4 @@
package test_test package e2e_test
import ( import (
"fmt" "fmt"
@@ -7,8 +7,8 @@ import (
. "github.com/onsi/gomega" . "github.com/onsi/gomega"
g "github.com/stv0g/gont/pkg" g "github.com/stv0g/gont/pkg"
gopt "github.com/stv0g/gont/pkg/options" gopt "github.com/stv0g/gont/pkg/options"
"riasc.eu/wice/test/nodes" "riasc.eu/wice/test/e2e/nodes"
wopt "riasc.eu/wice/test/nodes/options/wg" wopt "riasc.eu/wice/test/e2e/nodes/options/wg"
) )
/* Typical wide-area NAT setup /* Typical wide-area NAT setup
@@ -40,7 +40,7 @@ import (
* n1 n2 (n3) * n1 n2 (n3)
* *
*/ */
var _ = Context("nat simple", func() { var _ = Context("nat simple: Simple home-router NAT setup", func() {
var ( var (
err error err error
@@ -141,7 +141,7 @@ var _ = Context("nat simple", func() {
n.SignalingNodes = nodes.SignalingList{s1} n.SignalingNodes = nodes.SignalingList{s1}
}) })
Context("2-nodes", func() { Context("2-nodes: Two agents connected to lan1 & lan2", func() {
JustBeforeEach(func() { JustBeforeEach(func() {
n.Start() n.Start()
}) })
@@ -149,7 +149,7 @@ var _ = Context("nat simple", func() {
n.ConnectivityTests() n.ConnectivityTests()
}) })
Context("3-nodes", func() { Context("3-nodes: Additional agent connected to lan2", func() {
JustBeforeEach(func() { JustBeforeEach(func() {
AddAgent(3, lan2) AddAgent(3, lan2)

View File

@@ -1,6 +1,6 @@
//go:build !tracer //go:build !tracer
package test_test package e2e_test
type HandshakeTracer any type HandshakeTracer any

View File

@@ -1,4 +1,4 @@
package test_test package e2e_test
import ( import (
"context" "context"
@@ -6,7 +6,6 @@ import (
"math/rand" "math/rand"
"os" "os"
"path/filepath" "path/filepath"
"strings"
"time" "time"
. "github.com/onsi/ginkgo/v2" . "github.com/onsi/ginkgo/v2"
@@ -16,9 +15,9 @@ import (
copt "github.com/stv0g/gont/pkg/options/capture" copt "github.com/stv0g/gont/pkg/options/capture"
"go.uber.org/zap" "go.uber.org/zap"
"riasc.eu/wice/pkg/test"
"riasc.eu/wice/pkg/util" "riasc.eu/wice/pkg/util"
"riasc.eu/wice/test/nodes" "riasc.eu/wice/test"
"riasc.eu/wice/test/e2e/nodes"
) )
var ( var (
@@ -157,10 +156,29 @@ func (n *Network) Close() {
Expect(err).To(Succeed(), "Failed to close network; %s", err) Expect(err).To(Succeed(), "Failed to close network; %s", err)
n.StopHandshakeTracer() n.StopHandshakeTracer()
n.WriteSpecReport()
GinkgoWriter.ClearTeeWriters() GinkgoWriter.ClearTeeWriters()
} }
func (n *Network) WriteSpecReport() {
report := CurrentSpecReport()
report.CapturedGinkgoWriterOutput = ""
reportJSON, err := report.MarshalJSON()
Expect(err).To(Succeed(), "Failed to marshal report: %s", err)
reportJSON, err = util.ReIndentJSON(reportJSON, "", " ")
Expect(err).To(Succeed(), "Failed to indent report: %s", err)
reportFileName := filepath.Join(n.BasePath, "report.json")
reportFile, err := os.OpenFile(reportFileName, os.O_CREATE|os.O_TRUNC|os.O_WRONLY, 0644)
Expect(err).To(Succeed(), "Failed to open report file: %s", err)
_, err = reportFile.Write(reportJSON)
Expect(err).To(Succeed(), "Failed to write report: %s", err)
}
func (n *Network) ConnectivityTests() { func (n *Network) ConnectivityTests() {
It("", func() { It("", func() {
By("Waiting until all peers are connected") By("Waiting until all peers are connected")
@@ -182,9 +200,7 @@ func (n *Network) Init() {
*n = Network{} *n = Network{}
n.Name = fmt.Sprintf("wice-%d", rand.Uint32()) n.Name = fmt.Sprintf("wice-%d", rand.Uint32())
n.BasePath = filepath.Join(SpecName()...)
name := GinkgoT().Name()
n.BasePath = filepath.Join(strings.Split(name, " ")...)
n.BasePath = filepath.Join("logs", n.BasePath) n.BasePath = filepath.Join("logs", n.BasePath)
logFilename := filepath.Join(n.BasePath, "test.log") logFilename := filepath.Join(n.BasePath, "test.log")

View File

@@ -1,6 +1,6 @@
//go:build tracer //go:build tracer
package test_test package e2e_test
import ( import (
"bytes" "bytes"

View File

@@ -5,7 +5,6 @@ import (
"fmt" "fmt"
"github.com/onsi/gomega/gexec" "github.com/onsi/gomega/gexec"
"riasc.eu/wice/test" "riasc.eu/wice/test"
) )
@@ -49,7 +48,7 @@ func BuildTestBinary(name string) (string, []any, error) {
// Build a test binary if profiling is requested // Build a test binary if profiling is requested
if len(profileFlags) > 0 { if len(profileFlags) > 0 {
// Generate coverage for all wice packages // Generate coverage for all wice packages
profileFlags["coverpkg"] = "../..." profileFlags["coverpkg"] = "../../..."
buildArgs = append(buildArgs, "-tags", "test") buildArgs = append(buildArgs, "-tags", "test")
@@ -60,9 +59,9 @@ func BuildTestBinary(name string) (string, []any, error) {
// We compile a dummy go test binary here which just // We compile a dummy go test binary here which just
// invokes main(), but is instrumented for profiling. // invokes main(), but is instrumented for profiling.
testBinaryPath, err = gexec.CompileTest("../cmd/wice", buildArgs...) testBinaryPath, err = gexec.CompileTest("../../cmd/wice", buildArgs...)
} else { } else {
testBinaryPath, err = gexec.Build("../cmd/wice", buildArgs...) testBinaryPath, err = gexec.Build("../../cmd/wice", buildArgs...)
} }
} }

View File

@@ -1,7 +1,7 @@
package options package options
import ( import (
"riasc.eu/wice/test/nodes" "riasc.eu/wice/test/e2e/nodes"
) )
type ExtraArgs []any type ExtraArgs []any

View File

@@ -7,7 +7,7 @@ import (
g "github.com/stv0g/gont/pkg" g "github.com/stv0g/gont/pkg"
"golang.zx2c4.com/wireguard/wgctrl/wgtypes" "golang.zx2c4.com/wireguard/wgctrl/wgtypes"
"riasc.eu/wice/pkg/crypto" "riasc.eu/wice/pkg/crypto"
"riasc.eu/wice/test/nodes" "riasc.eu/wice/test/e2e/nodes"
) )
type PrivateKey crypto.Key type PrivateKey crypto.Key

View File

@@ -7,7 +7,7 @@ import (
"golang.zx2c4.com/wireguard/wgctrl/wgtypes" "golang.zx2c4.com/wireguard/wgctrl/wgtypes"
"riasc.eu/wice/pkg/crypto" "riasc.eu/wice/pkg/crypto"
"riasc.eu/wice/test/nodes" "riasc.eu/wice/test/e2e/nodes"
) )
// PublicKey specifies the public key of this peer. PublicKey is a // PublicKey specifies the public key of this peer. PublicKey is a

View File

@@ -1,4 +1,4 @@
package test_test package e2e_test
import ( import (
"context" "context"
@@ -6,10 +6,11 @@ import (
"time" "time"
"riasc.eu/wice/pkg/crypto" "riasc.eu/wice/pkg/crypto"
"riasc.eu/wice/pkg/proto"
"riasc.eu/wice/pkg/util" "riasc.eu/wice/pkg/util"
"riasc.eu/wice/pkg/wg" "riasc.eu/wice/pkg/wg"
"riasc.eu/wice/test/nodes" "riasc.eu/wice/test/e2e/nodes"
wopt "riasc.eu/wice/test/nodes/options/wg" wopt "riasc.eu/wice/test/e2e/nodes/options/wg"
. "github.com/onsi/ginkgo/v2" . "github.com/onsi/ginkgo/v2"
. "github.com/onsi/gomega" . "github.com/onsi/gomega"
@@ -37,7 +38,7 @@ import (
* *
* wice Agents * wice Agents
*/ */
var _ = Context("restart", func() { var _ = Context("restart: Restart ICE agents", func() {
var ( var (
err error err error
n Network n Network
@@ -123,9 +124,7 @@ var _ = Context("restart", func() {
ConnectivityTestCycle := func() { ConnectivityTestCycle := func() {
n.ConnectivityTests() n.ConnectivityTests()
It("", func() { It("Triggering restart", func() {
By("Triggering restart")
restart(gap) restart(gap)
time.Sleep(gap) time.Sleep(gap)
@@ -134,7 +133,7 @@ var _ = Context("restart", func() {
n.ConnectivityTests() n.ConnectivityTests()
} }
Context("quick", Ordered, func() { Context("quick: Waiting 3 seconds", Ordered, func() {
BeforeEach(func() { BeforeEach(func() {
gap = 3 * time.Second gap = 3 * time.Second
}) })
@@ -142,7 +141,7 @@ var _ = Context("restart", func() {
ConnectivityTestCycle() ConnectivityTestCycle()
}) })
Context("slow", Ordered, func() { Context("slow: Waiting 10 seconds to trigger an ICE disconnect", Ordered, func() {
BeforeEach(func() { BeforeEach(func() {
gap = 10 * time.Second // > ICE failed/disconnected timeout (5s) gap = 10 * time.Second // > ICE failed/disconnected timeout (5s)
}) })
@@ -151,7 +150,7 @@ var _ = Context("restart", func() {
}) })
} }
Context("agent", func() { Context("agent: Restart agent", func() {
RestartTest(func(gap time.Duration) { RestartTest(func(gap time.Duration) {
By("Stopping first agent") By("Stopping first agent")
@@ -169,7 +168,7 @@ var _ = Context("restart", func() {
}) })
}) })
Context("addresses", Pending, func() { Context("addresses: Change uplink IP address", Pending, func() {
RestartTest(func(gap time.Duration) { RestartTest(func(gap time.Duration) {
i := n1.Interface("eth0") i := n1.Interface("eth0")
Expect(i).NotTo(BeNil(), "Failed to find agent interface") Expect(i).NotTo(BeNil(), "Failed to find agent interface")
@@ -206,7 +205,7 @@ var _ = Context("restart", func() {
}) })
}) })
Context("link", Pending, func() { Context("link: Bring uplink down and up", Pending, func() {
RestartTest(func(gap time.Duration) { RestartTest(func(gap time.Duration) {
i := n1.Interface("eth0") i := n1.Interface("eth0")
Expect(i).NotTo(BeNil(), "Failed to find agent interface") Expect(i).NotTo(BeNil(), "Failed to find agent interface")
@@ -227,36 +226,62 @@ var _ = Context("restart", func() {
}) })
}) })
Context("rpc", func() { Context("peer-rpc: Restart peer via RPC", func() {
RestartTest(func(gap time.Duration) { RestartTest(func(gap time.Duration) {
ctx := context.Background() ctx := context.Background()
i := n1.WireGuardInterfaces[0]
p := i.Peers[0]
pk := (*crypto.Key)(&p.PublicKey)
By("Initiating restart via RPC") By("Initiating restart via RPC")
i := n1.WireGuardInterfaces[0]
pk := (*crypto.Key)(&i.Peers[0].PublicKey)
err = n1.Client.RestartPeer(ctx, i.Name, pk) err = n1.Client.RestartPeer(ctx, i.Name, pk)
Expect(err).To(Succeed(), "Failed to restart peer: %s", err) Expect(err).To(Succeed(), "Failed to restart peer: %s", err)
}) })
}) })
Context("signaling", Pending, func() { Context("agent-rpc: Restart agent via RPC", Pending, func() {
RestartTest(func(gap time.Duration) { RestartTest(func(gap time.Duration) {
ctx := context.Background()
By("Initiating agent restart via RPC")
_, err = n1.Client.Restart(ctx, &proto.Empty{})
Expect(err).To(Succeed(), "Failed to restart peer: %s", err)
})
})
Context("signaling: Restart signaling server", Pending, func() {
RestartTest(func(gap time.Duration) {
ctx := context.Background()
By("Stopping signaling server") By("Stopping signaling server")
err = s1.Stop() err = s1.Stop()
Expect(err).To(Succeed(), "Failed to stop signaling server") Expect(err).To(Succeed(), "Failed to stop signaling server")
By("Restarting peer")
i := n1.WireGuardInterfaces[0]
pk := (*crypto.Key)(&i.Peers[0].PublicKey)
err = n1.Client.RestartPeer(ctx, i.Name, pk)
Expect(err).To(Succeed(), "Failed to restart peer: %s", err)
By("Waiting some time") By("Waiting some time")
time.Sleep(gap) time.Sleep(gap)
By("Re-starting signaling server again") By("Starting signaling server again")
err = s1.Start("", n.BasePath) err = s1.Start("", n.BasePath)
Expect(err).To(Succeed(), "Failed to restart signaling server: %s", err) Expect(err).To(Succeed(), "Failed to restart signaling server: %s", err)
}) })
}) })
Context("private-key: Trigger recreation of peer by changing private-key of interface", func() {
RestartTest(func(gap time.Duration) {
By("Changing private-key")
// i.Configuring
})
})
}) })

View File

@@ -1,13 +1,13 @@
package test_test package e2e_test
import ( import (
"fmt" "fmt"
"golang.org/x/sys/unix" "golang.org/x/sys/unix"
"riasc.eu/wice/pkg/wg" "riasc.eu/wice/pkg/wg"
"riasc.eu/wice/test/nodes" "riasc.eu/wice/test/e2e/nodes"
opt "riasc.eu/wice/test/nodes/options" opt "riasc.eu/wice/test/e2e/nodes/options"
wopt "riasc.eu/wice/test/nodes/options/wg" wopt "riasc.eu/wice/test/e2e/nodes/options/wg"
. "github.com/onsi/ginkgo/v2" . "github.com/onsi/ginkgo/v2"
. "github.com/onsi/gomega" . "github.com/onsi/gomega"
@@ -37,7 +37,7 @@ import (
* *
* wice Agents * wice Agents
*/ */
var _ = Context("simple", Serial, func() { var _ = Context("simple: Simple local-area switched topology with variable number of agents", Serial, func() {
var ( var (
err error err error
n Network n Network
@@ -142,38 +142,38 @@ var _ = Context("simple", Serial, func() {
ConnectivityTestsForAllCandidateTypes := func() { ConnectivityTestsForAllCandidateTypes := func() {
Context("candidate-types", func() { Context("candidate-types", func() {
Context("any", func() { Context("any: Allow any candidate type", func() {
Context("ipv4", func() { Context("ipv4: Allow IPv4 network only", func() {
ConnectivityTestsWithExtraArgs("--ice-network-type", "udp4") ConnectivityTestsWithExtraArgs("--ice-network-type", "udp4")
}) })
Context("ipv6", func() { Context("ipv6: Allow IPv6 network only", func() {
ConnectivityTestsWithExtraArgs("--ice-network-type", "udp6") ConnectivityTestsWithExtraArgs("--ice-network-type", "udp6")
}) })
}) })
Context("host", func() { Context("host: Allow only host candidates", func() {
Context("ipv4", func() { Context("ipv4: Allow IPv4 network only", func() {
ConnectivityTestsWithExtraArgs("--ice-candidate-type", "host", "--ice-network-type", "udp4") ConnectivityTestsWithExtraArgs("--ice-candidate-type", "host", "--ice-network-type", "udp4")
}) })
Context("ipv6", func() { Context("ipv6: Allow IPv6 network only", func() {
ConnectivityTestsWithExtraArgs("--ice-candidate-type", "host", "--ice-network-type", "udp6") ConnectivityTestsWithExtraArgs("--ice-candidate-type", "host", "--ice-network-type", "udp6")
}) })
}) })
Context("srflx", func() { Context("srflx: Allow only server reflexive candidates", func() {
Context("ipv4", func() { Context("ipv4: Allow IPv4 network only", func() {
ConnectivityTestsWithExtraArgs("--ice-candidate-type", "srflx", "--ice-network-type", "udp4") ConnectivityTestsWithExtraArgs("--ice-candidate-type", "srflx", "--ice-network-type", "udp4")
}) })
Context("ipv6", func() { Context("ipv6: Allow IPv6 network only", func() {
ConnectivityTestsWithExtraArgs("--ice-candidate-type", "srflx", "--ice-network-type", "udp6") ConnectivityTestsWithExtraArgs("--ice-candidate-type", "srflx", "--ice-network-type", "udp6")
}) })
}) })
Context("relay", func() { Context("relay: Allow only relay candidates", func() {
Context("ipv4", func() { Context("ipv4: Allow IPv4 network only", func() {
ConnectivityTestsWithExtraArgs("--ice-candidate-type", "relay", "--ice-network-type", "udp4") ConnectivityTestsWithExtraArgs("--ice-candidate-type", "relay", "--ice-network-type", "udp4")
}) })
@@ -185,11 +185,11 @@ var _ = Context("simple", Serial, func() {
}) })
} }
Context("kernel", func() { Context("kernel: Use kernel WireGuard interface", func() {
ConnectivityTestsForAllCandidateTypes() ConnectivityTestsForAllCandidateTypes()
}) })
Context("userspace", func() { Context("userspace: Use wireguard-go userspace interfaces", func() {
BeforeEach(func() { BeforeEach(func() {
n.WireGuardInterfaceOptions = append(n.WireGuardInterfaceOptions, n.WireGuardInterfaceOptions = append(n.WireGuardInterfaceOptions,
wopt.WriteConfigFile(true), wopt.WriteConfigFile(true),
@@ -204,8 +204,8 @@ var _ = Context("simple", Serial, func() {
ConnectivityTestsForAllCandidateTypes() ConnectivityTestsForAllCandidateTypes()
}) })
Context("filtered", func() { Context("filtered: Block WireGuard UDP traffic", func() {
Context("p2p", func() { Context("p2p: Between agents only", func() {
BeforeEach(func() { BeforeEach(func() {
// We are dropped packets between the ɯice nodes to force ICE using the relay // We are dropped packets between the ɯice nodes to force ICE using the relay
n.AgentOptions = append(n.AgentOptions, n.AgentOptions = append(n.AgentOptions,
@@ -225,7 +225,7 @@ var _ = Context("simple", Serial, func() {
n.ConnectivityTests() n.ConnectivityTests()
}) })
Context("all-udp", func() { Context("all-udp: All UDP entirely", func() {
BeforeEach(func() { BeforeEach(func() {
n.AgentOptions = append(n.AgentOptions, n.AgentOptions = append(n.AgentOptions,
gopt.Filter(g.FilterInput, gopt.Filter(g.FilterInput,
@@ -239,4 +239,32 @@ var _ = Context("simple", Serial, func() {
n.ConnectivityTests() n.ConnectivityTests()
}) })
}) })
Context("pdisc: Peer Discovery", Pending, Ordered, func() {
BeforeEach(OncePerOrdered, func() {
n.AgentOptions = append(n.AgentOptions,
opt.ExtraArgs{"--community", "hallo"},
)
n.WireGuardInterfaceOptions = append(n.WireGuardInterfaceOptions,
wopt.NoPeers,
)
NumAgents = 3
})
n.ConnectivityTests()
It("", func() {
By("Check existing peers 2")
n.AgentNodes.ForEachAgent(func(a *nodes.Agent) error {
out, _, err := a.Run("wg")
Expect(err).To(Succeed())
GinkgoWriter.Write(out)
return nil
})
})
})
}) })

View File

@@ -1,8 +1,8 @@
package test_test package e2e_test
import ( import (
"riasc.eu/wice/pkg/wg" "riasc.eu/wice/pkg/wg"
"riasc.eu/wice/test/nodes" "riasc.eu/wice/test/e2e/nodes"
. "github.com/onsi/ginkgo/v2" . "github.com/onsi/ginkgo/v2"
. "github.com/onsi/gomega" . "github.com/onsi/gomega"
@@ -10,7 +10,7 @@ import (
gopt "github.com/stv0g/gont/pkg/options" gopt "github.com/stv0g/gont/pkg/options"
) )
var _ = Context("single", Pending, func() { var _ = Context("single: A single node to test RPC and watcher", Pending, func() {
var n Network var n Network
BeforeEach(func() { BeforeEach(func() {
@@ -43,17 +43,17 @@ var _ = Context("single", Pending, func() {
n.AgentNodes = nodes.AgentList{n1} n.AgentNodes = nodes.AgentList{n1}
}) })
Context("create", func() { Context("create: Create a new interface", func() {
Context("kernel", func() { Context("kernel: Kernel-space", func() {
}) })
Context("userspace", func() { Context("userspace: User-space", func() {
}) })
}) })
Context("watcher", Ordered, func() { Context("watcher: Watch for changes of WireGuard interfaces and peers", Ordered, func() {
It("detects a new interface", func() { It("detects a new interface", func() {
}) })
@@ -79,15 +79,19 @@ var _ = Context("single", Pending, func() {
}) })
}) })
Context("host-sync", func() { Context("hsync: /etc/hosts synchronization", func() {
}) })
Context("route-sync", func() { Context("rtsync: Route synchronization", func() {
}) })
Context("config-sync", func() { Context("cfgsync: Config file synchronization", func() {
})
Context("autocfg: Auto-configuration of missing interface parameters", func() {
}) })
}) })

View File

@@ -1,8 +1,9 @@
package test_test package e2e_test
import ( import (
"flag" "flag"
"math/rand" "math/rand"
"strings"
"testing" "testing"
"time" "time"
@@ -12,6 +13,7 @@ import (
"github.com/onsi/gomega/gexec" "github.com/onsi/gomega/gexec"
"riasc.eu/wice/pkg/util" "riasc.eu/wice/pkg/util"
"github.com/onsi/ginkgo/v2/reporters"
"github.com/onsi/ginkgo/v2/types" "github.com/onsi/ginkgo/v2/types"
) )
@@ -33,7 +35,6 @@ func TestSuite(t *testing.T) {
RegisterFailHandler(Fail) RegisterFailHandler(Fail)
RunSpecs(t, "E2E Test Suite", types.ReporterConfig{ RunSpecs(t, "E2E Test Suite", types.ReporterConfig{
JSONReport: "logs/report.json",
SlowSpecThreshold: 1 * time.Minute, SlowSpecThreshold: 1 * time.Minute,
}) })
} }
@@ -45,3 +46,36 @@ var _ = BeforeSuite(func() {
DeferCleanup(gexec.CleanupBuildArtifacts) DeferCleanup(gexec.CleanupBuildArtifacts)
}) })
var _ = ReportAfterSuite("Write report", func(r Report) {
r.SpecReports = nil
reporters.GenerateJSONReport(r, "logs/report.json")
})
func SpecName() []string {
sr := CurrentSpecReport()
normalize := func(s string) ([]string, bool) {
p := strings.SplitN(s, ":", 2)
if len(p) != 2 {
return []string{}, false
}
ps := strings.Split(strings.ToLower(p[0]), " ")
return ps, true
}
sn := []string{}
for _, txt := range sr.ContainerHierarchyTexts {
if n, ok := normalize(txt); ok {
sn = append(sn, n...)
}
}
if n, ok := normalize(sr.LeafNodeText); ok {
sn = append(sn, n...)
}
return sn
}

View File

@@ -6,7 +6,7 @@ import (
. "github.com/onsi/ginkgo/v2" . "github.com/onsi/ginkgo/v2"
. "github.com/onsi/gomega" . "github.com/onsi/gomega"
"riasc.eu/wice/pkg/test" "riasc.eu/wice/test"
) )
func TestSuite(t *testing.T) { func TestSuite(t *testing.T) {