tests: Add test for TP_DATA_LOC_READ_CONST
authorSasha Goldshtein <goldshtn@gmail.com>
Wed, 1 Feb 2017 09:39:12 +0000 (09:39 +0000)
committerSasha Goldshtein <goldshtn@gmail.com>
Wed, 1 Feb 2017 09:40:10 +0000 (09:40 +0000)
tests/python/test_tracepoint.py

index d2eaefc..25d8270 100755 (executable)
@@ -7,6 +7,7 @@ import unittest
 from time import sleep
 import distutils.version
 import os
+import subprocess
 
 def kernel_version_ge(major, minor):
     # True if running kernel is >= X.Y
@@ -39,5 +40,31 @@ class TestTracepoint(unittest.TestCase):
             total_switches += v.value
         self.assertNotEqual(0, total_switches)
 
+@unittest.skipUnless(kernel_version_ge(4,7), "requires kernel >= 4.7")
+class TestTracepointDataLoc(unittest.TestCase):
+    def test_tracepoint_data_loc(self):
+        text = """
+        struct value_t {
+            char filename[64];
+        };
+        BPF_HASH(execs, u32, struct value_t);
+        TRACEPOINT_PROBE(sched, sched_process_exec) {
+            struct value_t val = {0};
+            char fn[64];
+            u32 pid = args->pid;
+            struct value_t *existing = execs.lookup_or_init(&pid, &val);
+            TP_DATA_LOC_READ_CONST(fn, filename, 64);
+            __builtin_memcpy(existing->filename, fn, 64);
+            return 0;
+        }
+        """
+        b = bcc.BPF(text=text)
+        subprocess.check_output(["/bin/ls"])
+        sleep(1)
+        found = False
+        for k, v in b["execs"].items():
+            found = "ls" in v.filename
+        self.assertTrue(found, "'ls' was not found in map")
+
 if __name__ == "__main__":
     unittest.main()