1*4882a593Smuzhiyun // SPDX-License-Identifier: GPL-2.0
2*4882a593Smuzhiyun /* Copyright (c) 2020 Facebook */
3*4882a593Smuzhiyun
4*4882a593Smuzhiyun #include <test_progs.h>
5*4882a593Smuzhiyun #include <time.h>
6*4882a593Smuzhiyun #include "test_varlen.skel.h"
7*4882a593Smuzhiyun
8*4882a593Smuzhiyun #define CHECK_VAL(got, exp) \
9*4882a593Smuzhiyun CHECK((got) != (exp), "check", "got %ld != exp %ld\n", \
10*4882a593Smuzhiyun (long)(got), (long)(exp))
11*4882a593Smuzhiyun
test_varlen(void)12*4882a593Smuzhiyun void test_varlen(void)
13*4882a593Smuzhiyun {
14*4882a593Smuzhiyun int duration = 0, err;
15*4882a593Smuzhiyun struct test_varlen* skel;
16*4882a593Smuzhiyun struct test_varlen__bss *bss;
17*4882a593Smuzhiyun struct test_varlen__data *data;
18*4882a593Smuzhiyun const char str1[] = "Hello, ";
19*4882a593Smuzhiyun const char str2[] = "World!";
20*4882a593Smuzhiyun const char exp_str[] = "Hello, \0World!\0";
21*4882a593Smuzhiyun const int size1 = sizeof(str1);
22*4882a593Smuzhiyun const int size2 = sizeof(str2);
23*4882a593Smuzhiyun
24*4882a593Smuzhiyun skel = test_varlen__open_and_load();
25*4882a593Smuzhiyun if (CHECK(!skel, "skel_open", "failed to open skeleton\n"))
26*4882a593Smuzhiyun return;
27*4882a593Smuzhiyun bss = skel->bss;
28*4882a593Smuzhiyun data = skel->data;
29*4882a593Smuzhiyun
30*4882a593Smuzhiyun err = test_varlen__attach(skel);
31*4882a593Smuzhiyun if (CHECK(err, "skel_attach", "skeleton attach failed: %d\n", err))
32*4882a593Smuzhiyun goto cleanup;
33*4882a593Smuzhiyun
34*4882a593Smuzhiyun bss->test_pid = getpid();
35*4882a593Smuzhiyun
36*4882a593Smuzhiyun /* trigger everything */
37*4882a593Smuzhiyun memcpy(bss->buf_in1, str1, size1);
38*4882a593Smuzhiyun memcpy(bss->buf_in2, str2, size2);
39*4882a593Smuzhiyun bss->capture = true;
40*4882a593Smuzhiyun usleep(1);
41*4882a593Smuzhiyun bss->capture = false;
42*4882a593Smuzhiyun
43*4882a593Smuzhiyun CHECK_VAL(bss->payload1_len1, size1);
44*4882a593Smuzhiyun CHECK_VAL(bss->payload1_len2, size2);
45*4882a593Smuzhiyun CHECK_VAL(bss->total1, size1 + size2);
46*4882a593Smuzhiyun CHECK(memcmp(bss->payload1, exp_str, size1 + size2), "content_check",
47*4882a593Smuzhiyun "doesn't match!\n");
48*4882a593Smuzhiyun
49*4882a593Smuzhiyun CHECK_VAL(data->payload2_len1, size1);
50*4882a593Smuzhiyun CHECK_VAL(data->payload2_len2, size2);
51*4882a593Smuzhiyun CHECK_VAL(data->total2, size1 + size2);
52*4882a593Smuzhiyun CHECK(memcmp(data->payload2, exp_str, size1 + size2), "content_check",
53*4882a593Smuzhiyun "doesn't match!\n");
54*4882a593Smuzhiyun
55*4882a593Smuzhiyun CHECK_VAL(data->payload3_len1, size1);
56*4882a593Smuzhiyun CHECK_VAL(data->payload3_len2, size2);
57*4882a593Smuzhiyun CHECK_VAL(data->total3, size1 + size2);
58*4882a593Smuzhiyun CHECK(memcmp(data->payload3, exp_str, size1 + size2), "content_check",
59*4882a593Smuzhiyun "doesn't match!\n");
60*4882a593Smuzhiyun
61*4882a593Smuzhiyun CHECK_VAL(data->payload4_len1, size1);
62*4882a593Smuzhiyun CHECK_VAL(data->payload4_len2, size2);
63*4882a593Smuzhiyun CHECK_VAL(data->total4, size1 + size2);
64*4882a593Smuzhiyun CHECK(memcmp(data->payload4, exp_str, size1 + size2), "content_check",
65*4882a593Smuzhiyun "doesn't match!\n");
66*4882a593Smuzhiyun cleanup:
67*4882a593Smuzhiyun test_varlen__destroy(skel);
68*4882a593Smuzhiyun }
69