1*3d1033caSMykyta Yatsenko // SPDX-License-Identifier: GPL-2.0 2*3d1033caSMykyta Yatsenko /* Copyright (c) 2025 Meta Platforms, Inc. and affiliates. */ 3*3d1033caSMykyta Yatsenko #include <test_progs.h> 4*3d1033caSMykyta Yatsenko #include <string.h> 5*3d1033caSMykyta Yatsenko #include <stdio.h> 6*3d1033caSMykyta Yatsenko 7*3d1033caSMykyta Yatsenko #define __CHECK_STR(str, name) \ 8*3d1033caSMykyta Yatsenko do { \ 9*3d1033caSMykyta Yatsenko if (!ASSERT_HAS_SUBSTR(fix->output, (str), (name))) \ 10*3d1033caSMykyta Yatsenko goto out; \ 11*3d1033caSMykyta Yatsenko } while (0) 12*3d1033caSMykyta Yatsenko 13*3d1033caSMykyta Yatsenko struct fixture { 14*3d1033caSMykyta Yatsenko char tmpfile[80]; 15*3d1033caSMykyta Yatsenko int fd; 16*3d1033caSMykyta Yatsenko char *output; 17*3d1033caSMykyta Yatsenko size_t sz; 18*3d1033caSMykyta Yatsenko char veristat[80]; 19*3d1033caSMykyta Yatsenko }; 20*3d1033caSMykyta Yatsenko 21*3d1033caSMykyta Yatsenko static struct fixture *init_fixture(void) 22*3d1033caSMykyta Yatsenko { 23*3d1033caSMykyta Yatsenko struct fixture *fix = malloc(sizeof(struct fixture)); 24*3d1033caSMykyta Yatsenko 25*3d1033caSMykyta Yatsenko /* for no_alu32 and cpuv4 veristat is in parent folder */ 26*3d1033caSMykyta Yatsenko if (access("./veristat", F_OK) == 0) 27*3d1033caSMykyta Yatsenko strcpy(fix->veristat, "./veristat"); 28*3d1033caSMykyta Yatsenko else if (access("../veristat", F_OK) == 0) 29*3d1033caSMykyta Yatsenko strcpy(fix->veristat, "../veristat"); 30*3d1033caSMykyta Yatsenko else 31*3d1033caSMykyta Yatsenko PRINT_FAIL("Can't find veristat binary"); 32*3d1033caSMykyta Yatsenko 33*3d1033caSMykyta Yatsenko snprintf(fix->tmpfile, sizeof(fix->tmpfile), "/tmp/test_veristat.XXXXXX"); 34*3d1033caSMykyta Yatsenko fix->fd = mkstemp(fix->tmpfile); 35*3d1033caSMykyta Yatsenko fix->sz = 1000000; 36*3d1033caSMykyta Yatsenko fix->output = malloc(fix->sz); 37*3d1033caSMykyta Yatsenko return fix; 38*3d1033caSMykyta Yatsenko } 39*3d1033caSMykyta Yatsenko 40*3d1033caSMykyta Yatsenko static void teardown_fixture(struct fixture *fix) 41*3d1033caSMykyta Yatsenko { 42*3d1033caSMykyta Yatsenko free(fix->output); 43*3d1033caSMykyta Yatsenko close(fix->fd); 44*3d1033caSMykyta Yatsenko remove(fix->tmpfile); 45*3d1033caSMykyta Yatsenko free(fix); 46*3d1033caSMykyta Yatsenko } 47*3d1033caSMykyta Yatsenko 48*3d1033caSMykyta Yatsenko static void test_set_global_vars_succeeds(void) 49*3d1033caSMykyta Yatsenko { 50*3d1033caSMykyta Yatsenko struct fixture *fix = init_fixture(); 51*3d1033caSMykyta Yatsenko 52*3d1033caSMykyta Yatsenko SYS(out, 53*3d1033caSMykyta Yatsenko "%s set_global_vars.bpf.o"\ 54*3d1033caSMykyta Yatsenko " -G \"var_s64 = 0xf000000000000001\" "\ 55*3d1033caSMykyta Yatsenko " -G \"var_u64 = 0xfedcba9876543210\" "\ 56*3d1033caSMykyta Yatsenko " -G \"var_s32 = -0x80000000\" "\ 57*3d1033caSMykyta Yatsenko " -G \"var_u32 = 0x76543210\" "\ 58*3d1033caSMykyta Yatsenko " -G \"var_s16 = -32768\" "\ 59*3d1033caSMykyta Yatsenko " -G \"var_u16 = 60652\" "\ 60*3d1033caSMykyta Yatsenko " -G \"var_s8 = -128\" "\ 61*3d1033caSMykyta Yatsenko " -G \"var_u8 = 255\" "\ 62*3d1033caSMykyta Yatsenko " -G \"var_ea = EA2\" "\ 63*3d1033caSMykyta Yatsenko " -G \"var_eb = EB2\" "\ 64*3d1033caSMykyta Yatsenko " -G \"var_ec = EC2\" "\ 65*3d1033caSMykyta Yatsenko " -G \"var_b = 1\" "\ 66*3d1033caSMykyta Yatsenko "-vl2 > %s", fix->veristat, fix->tmpfile); 67*3d1033caSMykyta Yatsenko 68*3d1033caSMykyta Yatsenko read(fix->fd, fix->output, fix->sz); 69*3d1033caSMykyta Yatsenko __CHECK_STR("_w=0xf000000000000001 ", "var_s64 = 0xf000000000000001"); 70*3d1033caSMykyta Yatsenko __CHECK_STR("_w=0xfedcba9876543210 ", "var_u64 = 0xfedcba9876543210"); 71*3d1033caSMykyta Yatsenko __CHECK_STR("_w=0x80000000 ", "var_s32 = -0x80000000"); 72*3d1033caSMykyta Yatsenko __CHECK_STR("_w=0x76543210 ", "var_u32 = 0x76543210"); 73*3d1033caSMykyta Yatsenko __CHECK_STR("_w=0x8000 ", "var_s16 = -32768"); 74*3d1033caSMykyta Yatsenko __CHECK_STR("_w=0xecec ", "var_u16 = 60652"); 75*3d1033caSMykyta Yatsenko __CHECK_STR("_w=128 ", "var_s8 = -128"); 76*3d1033caSMykyta Yatsenko __CHECK_STR("_w=255 ", "var_u8 = 255"); 77*3d1033caSMykyta Yatsenko __CHECK_STR("_w=11 ", "var_ea = EA2"); 78*3d1033caSMykyta Yatsenko __CHECK_STR("_w=12 ", "var_eb = EB2"); 79*3d1033caSMykyta Yatsenko __CHECK_STR("_w=13 ", "var_ec = EC2"); 80*3d1033caSMykyta Yatsenko __CHECK_STR("_w=1 ", "var_b = 1"); 81*3d1033caSMykyta Yatsenko 82*3d1033caSMykyta Yatsenko out: 83*3d1033caSMykyta Yatsenko teardown_fixture(fix); 84*3d1033caSMykyta Yatsenko } 85*3d1033caSMykyta Yatsenko 86*3d1033caSMykyta Yatsenko static void test_set_global_vars_from_file_succeeds(void) 87*3d1033caSMykyta Yatsenko { 88*3d1033caSMykyta Yatsenko struct fixture *fix = init_fixture(); 89*3d1033caSMykyta Yatsenko char input_file[80]; 90*3d1033caSMykyta Yatsenko const char *vars = "var_s16 = -32768\nvar_u16 = 60652"; 91*3d1033caSMykyta Yatsenko int fd; 92*3d1033caSMykyta Yatsenko 93*3d1033caSMykyta Yatsenko snprintf(input_file, sizeof(input_file), "/tmp/veristat_input.XXXXXX"); 94*3d1033caSMykyta Yatsenko fd = mkstemp(input_file); 95*3d1033caSMykyta Yatsenko if (!ASSERT_GE(fd, 0, "valid fd")) 96*3d1033caSMykyta Yatsenko goto out; 97*3d1033caSMykyta Yatsenko 98*3d1033caSMykyta Yatsenko write(fd, vars, strlen(vars)); 99*3d1033caSMykyta Yatsenko syncfs(fd); 100*3d1033caSMykyta Yatsenko SYS(out, "%s set_global_vars.bpf.o -G \"@%s\" -vl2 > %s", 101*3d1033caSMykyta Yatsenko fix->veristat, input_file, fix->tmpfile); 102*3d1033caSMykyta Yatsenko read(fix->fd, fix->output, fix->sz); 103*3d1033caSMykyta Yatsenko __CHECK_STR("_w=0x8000 ", "var_s16 = -32768"); 104*3d1033caSMykyta Yatsenko __CHECK_STR("_w=0xecec ", "var_u16 = 60652"); 105*3d1033caSMykyta Yatsenko 106*3d1033caSMykyta Yatsenko out: 107*3d1033caSMykyta Yatsenko close(fd); 108*3d1033caSMykyta Yatsenko remove(input_file); 109*3d1033caSMykyta Yatsenko teardown_fixture(fix); 110*3d1033caSMykyta Yatsenko } 111*3d1033caSMykyta Yatsenko 112*3d1033caSMykyta Yatsenko static void test_set_global_vars_out_of_range(void) 113*3d1033caSMykyta Yatsenko { 114*3d1033caSMykyta Yatsenko struct fixture *fix = init_fixture(); 115*3d1033caSMykyta Yatsenko 116*3d1033caSMykyta Yatsenko SYS_FAIL(out, 117*3d1033caSMykyta Yatsenko "%s set_global_vars.bpf.o -G \"var_s32 = 2147483648\" -vl2 2> %s", 118*3d1033caSMykyta Yatsenko fix->veristat, fix->tmpfile); 119*3d1033caSMykyta Yatsenko 120*3d1033caSMykyta Yatsenko read(fix->fd, fix->output, fix->sz); 121*3d1033caSMykyta Yatsenko __CHECK_STR("is out of range [-2147483648; 2147483647]", "out of range"); 122*3d1033caSMykyta Yatsenko 123*3d1033caSMykyta Yatsenko out: 124*3d1033caSMykyta Yatsenko teardown_fixture(fix); 125*3d1033caSMykyta Yatsenko } 126*3d1033caSMykyta Yatsenko 127*3d1033caSMykyta Yatsenko void test_veristat(void) 128*3d1033caSMykyta Yatsenko { 129*3d1033caSMykyta Yatsenko if (test__start_subtest("set_global_vars_succeeds")) 130*3d1033caSMykyta Yatsenko test_set_global_vars_succeeds(); 131*3d1033caSMykyta Yatsenko 132*3d1033caSMykyta Yatsenko if (test__start_subtest("set_global_vars_out_of_range")) 133*3d1033caSMykyta Yatsenko test_set_global_vars_out_of_range(); 134*3d1033caSMykyta Yatsenko 135*3d1033caSMykyta Yatsenko if (test__start_subtest("set_global_vars_from_file_succeeds")) 136*3d1033caSMykyta Yatsenko test_set_global_vars_from_file_succeeds(); 137*3d1033caSMykyta Yatsenko } 138*3d1033caSMykyta Yatsenko 139*3d1033caSMykyta Yatsenko #undef __CHECK_STR 140