Skip to content

Commit

Permalink
Add app integeration test
Browse files Browse the repository at this point in the history
Signed-off-by: Mohamed Mahmoud <mmahmoud@redhat.com>
  • Loading branch information
msherif1234 committed Jun 14, 2024
1 parent 231567f commit 86fa441
Show file tree
Hide file tree
Showing 7 changed files with 142 additions and 39 deletions.
62 changes: 62 additions & 0 deletions test/integration/app_test.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,62 @@
//go:build integration_tests
// +build integration_tests

package integration

import (
"bytes"
"context"
"io"
"testing"
"time"

"github.com/kong/kubernetes-testing-framework/pkg/clusters"
"github.com/stretchr/testify/require"
corev1 "k8s.io/api/core/v1"
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
)

const (
appGoCounterKustomize = "https://github.com/bpfman/bpfman/examples/config/default/go-app-counter/?timeout=120&ref=main"
appGoCounterUserspaceNs = "go-application-counter"
appGoCounterUserspaceDsName = "go-application-counter-ds"
)

func TestApplicationGoCounter(t *testing.T) {
t.Log("deploying application counter program")
require.NoError(t, clusters.KustomizeDeployForCluster(ctx, env.Cluster(), appGoCounterKustomize))
addCleanup(func(context.Context) error {
cleanupLog("cleaning up application counter program")
return clusters.KustomizeDeleteForCluster(ctx, env.Cluster(), appGoCounterKustomize)
})

t.Log("waiting for go application counter userspace daemon to be available")
require.Eventually(t, func() bool {
daemon, err := env.Cluster().Client().AppsV1().DaemonSets(appGoCounterUserspaceNs).Get(ctx, appGoCounterUserspaceDsName, metav1.GetOptions{})
require.NoError(t, err)
return daemon.Status.DesiredNumberScheduled == daemon.Status.NumberAvailable
},
// Wait 5 minutes since cosign is slow, https://github.com/bpfman/bpfman/issues/1043
5*time.Minute, 10*time.Second)

pods, err := env.Cluster().Client().CoreV1().Pods(appGoCounterUserspaceNs).List(ctx, metav1.ListOptions{LabelSelector: "name=go-application-counter"})
require.NoError(t, err)
goAppCounterPod := pods.Items[0]

req := env.Cluster().Client().CoreV1().Pods(appGoCounterUserspaceNs).GetLogs(goAppCounterPod.Name, &corev1.PodLogOptions{})
require.Eventually(t, func() bool {
logs, err := req.Stream(ctx)
require.NoError(t, err)
defer logs.Close()
output := new(bytes.Buffer)
_, err = io.Copy(output, logs)
require.NoError(t, err)
t.Logf("counter pod log %s", output.String())

if doKprobeCheck(t, output) && doTcCheck(output) && doTracepointCheck(t, output) && doUprobeCheck(t, output) && doXdpCheck(output) {
return true
}

return false
}, 30*time.Second, time.Second)
}
70 changes: 70 additions & 0 deletions test/integration/common.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,70 @@
//go:build integration_tests
// +build integration_tests

package integration

import (
"bytes"
"regexp"
"strconv"
"strings"
"testing"

"github.com/stretchr/testify/require"
)

func doKprobeCheck(t *testing.T, output *bytes.Buffer) bool {
want := regexp.MustCompile(`Kprobe count: ([0-9]+)`)
matches := want.FindAllStringSubmatch(output.String(), -1)
if len(matches) >= 1 && len(matches[0]) >= 2 {
count, err := strconv.Atoi(matches[0][1])
require.NoError(t, err)
if count > 0 {
t.Logf("counted %d application executions so far, BPF program is functioning", count)
return true
}
}
return false
}

func doTcCheck(output *bytes.Buffer) bool {
if strings.Contains(output.String(), "packets received") && strings.Contains(output.String(), "bytes received") {
return true
}
return false
}

func doTracepointCheck(t *testing.T, output *bytes.Buffer) bool {
want := regexp.MustCompile(`SIGUSR1 signal count: ([0-9]+)`)
matches := want.FindAllStringSubmatch(output.String(), -1)
if len(matches) >= 1 && len(matches[0]) >= 2 {
count, err := strconv.Atoi(matches[0][1])
require.NoError(t, err)
if count > 0 {
t.Logf("counted %d SIGUSR1 signals so far, BPF program is functioning", count)
return true
}
}
return false
}

func doUprobeCheck(t *testing.T, output *bytes.Buffer) bool {
want := regexp.MustCompile(`Uprobe count: ([0-9]+)`)
matches := want.FindAllStringSubmatch(output.String(), -1)
if len(matches) >= 1 && len(matches[0]) >= 2 {
count, err := strconv.Atoi(matches[0][1])
require.NoError(t, err)
if count > 0 {
t.Logf("counted %d uprobe executions so far, BPF program is functioning", count)
return true
}
}
return false
}

func doXdpCheck(output *bytes.Buffer) bool {
if strings.Contains(output.String(), "packets received") && strings.Contains(output.String(), "bytes received") {
return true
}
return false
}
13 changes: 2 additions & 11 deletions test/integration/kprobe_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -7,8 +7,6 @@ import (
"bytes"
"context"
"io"
"regexp"
"strconv"
"testing"
"time"

Expand Down Expand Up @@ -45,7 +43,6 @@ func TestKprobeGoCounter(t *testing.T) {
require.NoError(t, err)
goKprobeCounterPod := pods.Items[0]

want := regexp.MustCompile(`Kprobe count: ([0-9]+)`)
req := env.Cluster().Client().CoreV1().Pods(kprobeGoCounterUserspaceNs).GetLogs(goKprobeCounterPod.Name, &corev1.PodLogOptions{})
require.Eventually(t, func() bool {
logs, err := req.Stream(ctx)
Expand All @@ -56,14 +53,8 @@ func TestKprobeGoCounter(t *testing.T) {
require.NoError(t, err)
t.Logf("counter pod log %s", output.String())

matches := want.FindAllStringSubmatch(output.String(), -1)
if len(matches) >= 1 && len(matches[0]) >= 2 {
count, err := strconv.Atoi(matches[0][1])
require.NoError(t, err)
if count > 0 {
t.Logf("counted %d kprobe executions so far, BPF program is functioning", count)
return true
}
if doKprobeCheck(t, output) {
return true
}
return false
}, 30*time.Second, time.Second)
Expand Down
4 changes: 2 additions & 2 deletions test/integration/tc_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,6 @@ import (
"bytes"
"context"
"io"
"strings"
"testing"
"time"

Expand Down Expand Up @@ -54,7 +53,8 @@ func TestTcGoCounter(t *testing.T) {
_, err = io.Copy(output, logs)
require.NoError(t, err)
t.Logf("counter pod log %s", output.String())
if strings.Contains(output.String(), "packets received") && strings.Contains(output.String(), "bytes received") {

if doTcCheck(output) {
return true
}
return false
Expand Down
14 changes: 2 additions & 12 deletions test/integration/tracepoint_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -7,8 +7,6 @@ import (
"bytes"
"context"
"io"
"regexp"
"strconv"
"testing"
"time"

Expand Down Expand Up @@ -45,7 +43,6 @@ func TestTracepointGoCounter(t *testing.T) {
require.NoError(t, err)
goTracepointCounterPod := pods.Items[0]

want := regexp.MustCompile(`SIGUSR1 signal count: ([0-9]+)`)
req := env.Cluster().Client().CoreV1().Pods(tracepointGoCounterUserspaceNs).GetLogs(goTracepointCounterPod.Name, &corev1.PodLogOptions{})
require.Eventually(t, func() bool {
logs, err := req.Stream(ctx)
Expand All @@ -55,15 +52,8 @@ func TestTracepointGoCounter(t *testing.T) {
_, err = io.Copy(output, logs)
require.NoError(t, err)
t.Logf("counter pod log %s", output.String())

matches := want.FindAllStringSubmatch(output.String(), -1)
if len(matches) >= 1 && len(matches[0]) >= 2 {
count, err := strconv.Atoi(matches[0][1])
require.NoError(t, err)
if count > 0 {
t.Logf("counted %d SIGUSR1 signals so far, BPF program is functioning", count)
return true
}
if doTracepointCheck(t, output) {
return true
}
return false
}, 30*time.Second, time.Second)
Expand Down
14 changes: 2 additions & 12 deletions test/integration/uprobe_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -7,8 +7,6 @@ import (
"bytes"
"context"
"io"
"regexp"
"strconv"
"testing"
"time"

Expand Down Expand Up @@ -64,7 +62,6 @@ func TestUprobeGoCounter(t *testing.T) {
require.NoError(t, err)
goUprobeCounterPod := pods.Items[0]

want := regexp.MustCompile(`Uprobe count: ([0-9]+)`)
req := env.Cluster().Client().CoreV1().Pods(uprobeGoCounterUserspaceNs).GetLogs(goUprobeCounterPod.Name, &corev1.PodLogOptions{})
require.Eventually(t, func() bool {
logs, err := req.Stream(ctx)
Expand All @@ -74,15 +71,8 @@ func TestUprobeGoCounter(t *testing.T) {
_, err = io.Copy(output, logs)
require.NoError(t, err)
t.Logf("counter pod log %s", output.String())

matches := want.FindAllStringSubmatch(output.String(), -1)
if len(matches) >= 1 && len(matches[0]) >= 2 {
count, err := strconv.Atoi(matches[0][1])
require.NoError(t, err)
if count > 0 {
t.Logf("counted %d uprobe executions so far, BPF program is functioning", count)
return true
}
if doUprobeCheck(t, output) {
return true
}
return false
}, 30*time.Second, time.Second)
Expand Down
4 changes: 2 additions & 2 deletions test/integration/xdp_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,6 @@ import (
"encoding/base64"
"io"
"os"
"strings"
"testing"
"time"

Expand Down Expand Up @@ -136,7 +135,8 @@ func TestXdpGoCounter(t *testing.T) {
_, err = io.Copy(output, logs)
require.NoError(t, err)
t.Logf("counter pod log %s", output.String())
if strings.Contains(output.String(), "packets received") && strings.Contains(output.String(), "bytes received") {

if doXdpCheck(output) {
return true
}
return false
Expand Down

0 comments on commit 86fa441

Please sign in to comment.