Skip to content

Commit

Permalink
exit: test to ensure that we get one exit event
Browse files Browse the repository at this point in the history
This works at bpf.

Signed-off-by: Djalal Harouni <tixxdz@gmail.com>
  • Loading branch information
tixxdz committed Sep 27, 2023
1 parent 8ed1a20 commit 05b2a94
Show file tree
Hide file tree
Showing 3 changed files with 105 additions and 1 deletion.
6 changes: 5 additions & 1 deletion contrib/tester-progs/Makefile
Original file line number Diff line number Diff line change
Expand Up @@ -16,13 +16,17 @@ PROGS = sigkill-tester \
uprobe-test-2 \
lseek-pipe \
threads-tester \
bench-reader
bench-reader \
exit-all-threads

all: $(PROGS)

%: %.c
$(GCC) -Wall $< -o $@

exit-all-threads: exit-all-threads.c
$(GCC) -Wall $< -o $@ -lpthread

bench-reader: bench-reader.c
$(GCC) -Wall $< -o $@ -lpthread

Expand Down
36 changes: 36 additions & 0 deletions contrib/tester-progs/exit-all-threads.c
Original file line number Diff line number Diff line change
@@ -0,0 +1,36 @@
#define _GNU_SOURCE
#include <stdio.h>
#include <pthread.h>
#include <unistd.h>
#include <stdlib.h>
#include <sys/syscall.h>

#define gettid() (int) syscall(SYS_gettid)

static void *worker(void *ctx)
{
fprintf(stderr, "start worker pid=%d tid=%d\n", getpid(), gettid());
sleep(4);
fprintf(stderr, "exit worker pid=%d tid=%d\n", getpid(), gettid());
return NULL;
}

int main(void)
{
pthread_t th1, th2;
int err;

err = pthread_create(&th1, NULL, worker, NULL);
if (err) {
perror("pthread_create");
return -1;
}
err = pthread_create(&th2, NULL, worker, NULL);
if (err) {
perror("pthread_create");
return -1;
}

fprintf(stderr, "exit main thread pid=%d tid=%d\n", getpid(), gettid());
exit(0);
}
64 changes: 64 additions & 0 deletions pkg/sensors/exec/exit_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -13,13 +13,20 @@ import (

"github.com/cilium/tetragon/api/v1/tetragon"
ec "github.com/cilium/tetragon/api/v1/tetragon/codegen/eventchecker"
grpcexec "github.com/cilium/tetragon/pkg/grpc/exec"
"github.com/cilium/tetragon/pkg/jsonchecker"

"github.com/cilium/tetragon/pkg/logger"
sm "github.com/cilium/tetragon/pkg/matchers/stringmatcher"
"github.com/cilium/tetragon/pkg/observer/observertesthelper"
"github.com/cilium/tetragon/pkg/option"
"github.com/cilium/tetragon/pkg/sensors/base"
"github.com/cilium/tetragon/pkg/testutils"
"github.com/cilium/tetragon/pkg/testutils/perfring"
tus "github.com/cilium/tetragon/pkg/testutils/sensors"
"github.com/sirupsen/logrus"
"github.com/stretchr/testify/assert"
"github.com/stretchr/testify/require"
)

func TestExit(t *testing.T) {
Expand Down Expand Up @@ -243,3 +250,60 @@ func TestExitCode(t *testing.T) {
err = jsonchecker.JsonTestCheck(t, checker)
assert.NoError(t, err)
}

// This test ensures that we get the exit event only once
func TestExitEventOnce(t *testing.T) {
testutils.CaptureLog(t, logger.GetLogger().(*logrus.Logger))

ctx, cancel := context.WithTimeout(context.Background(), tus.Conf().CmdWaitTime)
defer cancel()

option.Config.HubbleLib = tus.Conf().TetragonLib
option.Config.Verbosity = 3

tus.LoadSensor(t, base.GetInitialSensor())
testManager := setupObserver(ctx, t)

testManager.AddAndEnableSensors(ctx, t, loadedSensors)
t.Cleanup(func() {
testManager.DisableSensors(ctx, t, loadedSensors)
})

pid := 0
exitCounter := 0
pidTidMismatch := 0
trigger := func() {
testAllThreads := testutils.RepoRootPath("contrib/tester-progs/exit-all-threads")
testCmd := exec.CommandContext(ctx, testAllThreads)
testPipes, err := testutils.NewCmdBufferedPipes(testCmd)
if err != nil {
t.Fatal(err)
}
defer testPipes.Close()
if err := testCmd.Start(); err != nil {
t.Fatal(err)
}
pid = testCmd.Process.Pid
logWG := testPipes.ParseAndLogCmdOutput(t, nil, nil)
logWG.Wait()

if err := testCmd.Wait(); err != nil {
t.Fatalf("command '%s' failed with: %s. Context error: %v", testAllThreads, err, ctx.Err())
}
}

events := perfring.RunTestEvents(t, ctx, trigger)
for _, ev := range events {
if event, ok := ev.(*grpcexec.MsgExitEventUnix); ok {
if uint32(pid) == event.ProcessKey.Pid {
exitCounter++
}
if event.ProcessKey.Pid != event.Info.Tid {
pidTidMismatch++
}
}
}

require.Equalf(t, 1, exitCounter, "Error received more than one exit event")
require.Zerof(t, pidTidMismatch, "Error Pid and Tid mismatch")
}

0 comments on commit 05b2a94

Please sign in to comment.