Back to home page

OSCL-LXR

 
 

    


0001 // SPDX-License-Identifier: GPL-2.0
0002 /*
0003  * User Events Dyn Events Test Program
0004  *
0005  * Copyright (c) 2021 Beau Belgrave <beaub@linux.microsoft.com>
0006  */
0007 
0008 #include <errno.h>
0009 #include <linux/user_events.h>
0010 #include <stdio.h>
0011 #include <stdlib.h>
0012 #include <fcntl.h>
0013 #include <sys/ioctl.h>
0014 #include <sys/stat.h>
0015 #include <unistd.h>
0016 
0017 #include "../kselftest_harness.h"
0018 
0019 const char *dyn_file = "/sys/kernel/debug/tracing/dynamic_events";
0020 const char *clear = "!u:__test_event";
0021 
0022 static int Append(const char *value)
0023 {
0024     int fd = open(dyn_file, O_RDWR | O_APPEND);
0025     int ret = write(fd, value, strlen(value));
0026 
0027     close(fd);
0028     return ret;
0029 }
0030 
0031 #define CLEAR() \
0032 do { \
0033     int ret = Append(clear); \
0034     if (ret == -1) \
0035         ASSERT_EQ(ENOENT, errno); \
0036 } while (0)
0037 
0038 #define TEST_PARSE(x) \
0039 do { \
0040     ASSERT_NE(-1, Append(x)); \
0041     CLEAR(); \
0042 } while (0)
0043 
0044 #define TEST_NPARSE(x) ASSERT_EQ(-1, Append(x))
0045 
0046 FIXTURE(user) {
0047 };
0048 
0049 FIXTURE_SETUP(user) {
0050     CLEAR();
0051 }
0052 
0053 FIXTURE_TEARDOWN(user) {
0054     CLEAR();
0055 }
0056 
0057 TEST_F(user, basic_types) {
0058     /* All should work */
0059     TEST_PARSE("u:__test_event u64 a");
0060     TEST_PARSE("u:__test_event u32 a");
0061     TEST_PARSE("u:__test_event u16 a");
0062     TEST_PARSE("u:__test_event u8 a");
0063     TEST_PARSE("u:__test_event char a");
0064     TEST_PARSE("u:__test_event unsigned char a");
0065     TEST_PARSE("u:__test_event int a");
0066     TEST_PARSE("u:__test_event unsigned int a");
0067     TEST_PARSE("u:__test_event short a");
0068     TEST_PARSE("u:__test_event unsigned short a");
0069     TEST_PARSE("u:__test_event char[20] a");
0070     TEST_PARSE("u:__test_event unsigned char[20] a");
0071     TEST_PARSE("u:__test_event char[0x14] a");
0072     TEST_PARSE("u:__test_event unsigned char[0x14] a");
0073     /* Bad size format should fail */
0074     TEST_NPARSE("u:__test_event char[aa] a");
0075     /* Large size should fail */
0076     TEST_NPARSE("u:__test_event char[9999] a");
0077     /* Long size string should fail */
0078     TEST_NPARSE("u:__test_event char[0x0000000000001] a");
0079 }
0080 
0081 TEST_F(user, loc_types) {
0082     /* All should work */
0083     TEST_PARSE("u:__test_event __data_loc char[] a");
0084     TEST_PARSE("u:__test_event __data_loc unsigned char[] a");
0085     TEST_PARSE("u:__test_event __rel_loc char[] a");
0086     TEST_PARSE("u:__test_event __rel_loc unsigned char[] a");
0087 }
0088 
0089 TEST_F(user, size_types) {
0090     /* Should work */
0091     TEST_PARSE("u:__test_event struct custom a 20");
0092     /* Size not specified on struct should fail */
0093     TEST_NPARSE("u:__test_event struct custom a");
0094     /* Size specified on non-struct should fail */
0095     TEST_NPARSE("u:__test_event char a 20");
0096 }
0097 
0098 TEST_F(user, flags) {
0099     /* Should work */
0100     TEST_PARSE("u:__test_event:BPF_ITER u32 a");
0101     /* Forward compat */
0102     TEST_PARSE("u:__test_event:BPF_ITER,FLAG_FUTURE u32 a");
0103 }
0104 
0105 TEST_F(user, matching) {
0106     /* Register */
0107     ASSERT_NE(-1, Append("u:__test_event struct custom a 20"));
0108     /* Should not match */
0109     TEST_NPARSE("!u:__test_event struct custom b");
0110     /* Should match */
0111     TEST_PARSE("!u:__test_event struct custom a");
0112     /* Multi field reg */
0113     ASSERT_NE(-1, Append("u:__test_event u32 a; u32 b"));
0114     /* Non matching cases */
0115     TEST_NPARSE("!u:__test_event u32 a");
0116     TEST_NPARSE("!u:__test_event u32 b");
0117     TEST_NPARSE("!u:__test_event u32 a; u32 ");
0118     TEST_NPARSE("!u:__test_event u32 a; u32 a");
0119     /* Matching case */
0120     TEST_PARSE("!u:__test_event u32 a; u32 b");
0121     /* Register */
0122     ASSERT_NE(-1, Append("u:__test_event u32 a; u32 b"));
0123     /* Ensure trailing semi-colon case */
0124     TEST_PARSE("!u:__test_event u32 a; u32 b;");
0125 }
0126 
0127 int main(int argc, char **argv)
0128 {
0129     return test_harness_run(argc, argv);
0130 }