def METHOD_NAME(self):
    # enable USDT probe from given PID and verifier generated BPF programs
    u = USDT(pid=int(self.app.pid))
    u.enable_probe(probe="probe_point_1", fn_name="do_trace1")
    u.enable_probe(probe="probe_point_2", fn_name="do_trace2")
    u.enable_probe(probe="probe_point_3", fn_name="do_trace3")
    u.enable_probe(probe="probe_point_4", fn_name="do_trace4")
    u.enable_probe(probe="probe_point_5", fn_name="do_trace5")
    b = BPF(text=self.bpf_text, usdt_contexts=[u], debug=4)
    # Event states for each event:
    # 0 - probe not caught, 1 - probe caught with correct value,
    # 2 - probe caught with incorrect value
    self.evt_st_1 = 0
    self.evt_st_2 = 0
    self.evt_st_3 = 0
    # define output data structure in Python
    class Data1(ct.Structure):
        _fields_ = [("v1", ct.c_char),
                    ("v2", ct.c_int)]
    class Data2(ct.Structure):
        _fields_ = [("v1", ct.c_int),
                    ("v2", ct.c_char)]
    class Data3(ct.Structure):
        _fields_ = [("v1", ct.c_int),
                    ("v2", ct.c_int)]
    class Data4(ct.Structure):
        _fields_ = [("v1", ct.c_ulonglong),
                    ("v2", ct.c_char * 64)]
    class Data5(ct.Structure):
        _fields_ = [("v1", ct.c_char * 64),
                    ("v2", ct.c_ulonglong)]
    def check_event_val(event, event_state, v1, v2, v3, v4):
        if ((event.v1 == v1 and event.v2 == v2) or (event.v1 == v3 and event.v2 == v4)):
            if (event_state == 0 or event_state == 1):
                return 1
        return 2
    def print_event1(cpu, data, size):
        event = ct.cast(data, ct.POINTER(Data1)).contents
        self.evt_st_1 = check_event_val(event, self.evt_st_1, b'\x0d', 40, b'\x08', 200)
    def print_event2(cpu, data, size):
        event = ct.cast(data, ct.POINTER(Data2)).contents
        # pretend we have two identical probe points to simplify the code
        self.evt_st_2 = check_event_val(event, self.evt_st_2, 5, b'\x04', 5, b'\x04')
    def print_event3(cpu, data, size):
        event = ct.cast(data, ct.POINTER(Data3)).contents
        self.evt_st_3 = check_event_val(event, self.evt_st_3, 200, 40, 8, 13)
    def print_event4(cpu, data, size):
        event = ct.cast(data, ct.POINTER(Data4)).contents
        print("%s" % event.v2)
    def print_event5(cpu, data, size):
        event = ct.cast(data, ct.POINTER(Data5)).contents
        print("%s" % event.v1)
    # loop with callback to print_event
    b[b"event1"].open_perf_buffer(print_event1)
    b[b"event2"].open_perf_buffer(print_event2)
    b[b"event3"].open_perf_buffer(print_event3)
    b[b"event4"].open_perf_buffer(print_event4)
    b[b"event5"].open_perf_buffer(print_event5)
    # three iterations to make sure we get some probes and have time to process them
    for i in range(3):
        b.perf_buffer_poll()
    self.assertTrue(self.evt_st_1 == 1 and self.evt_st_2 == 1 and self.evt_st_3 == 1)