X-Git-Url: http://git.liburcu.org/?a=blobdiff_plain;f=tests%2Fregression%2Fkernel%2Fvalidate_select_poll_epoll.py;h=0ca0ba67cc3c149a47dc34030124c4fb5b0deb73;hb=6a871bbe6177568f748d1a9f580fa981bc75171c;hp=97c7764c0a9fbb4975539a20d159e490271e7912;hpb=d40c26206a44d9e247bbcdc01afb34c41d0c490d;p=lttng-tools.git diff --git a/tests/regression/kernel/validate_select_poll_epoll.py b/tests/regression/kernel/validate_select_poll_epoll.py index 97c7764c0..0ca0ba67c 100755 --- a/tests/regression/kernel/validate_select_poll_epoll.py +++ b/tests/regression/kernel/validate_select_poll_epoll.py @@ -17,12 +17,15 @@ try: import bt2 except ImportError: # quick fix for debian-based distros - sys.path.append("/usr/local/lib/python%d.%d/site-packages" % - (sys.version_info.major, sys.version_info.minor)) + sys.path.append( + "/usr/local/lib/python%d.%d/site-packages" + % (sys.version_info.major, sys.version_info.minor) + ) import bt2 NSEC_PER_SEC = 1000000000 + class TraceParser: def __init__(self, trace_msg_iter, pid): self.trace = trace_msg_iter @@ -37,7 +40,7 @@ class TraceParser: # Each test classes checks the payload of different events. Each of # those checks are stored in a event_name specific dictionnary in this # data structure. - self.expect = defaultdict(lambda : defaultdict(int)) + self.expect = defaultdict(lambda: defaultdict(int)) # This dictionnary holds the value recorded in the trace that are # tested. Its content is use to print the values that caused a test to @@ -45,9 +48,13 @@ class TraceParser: self.recorded_values = {} def ns_to_hour_nsec(self, ns): - d = time.localtime(ns/NSEC_PER_SEC) - return "%02d:%02d:%02d.%09d" % (d.tm_hour, d.tm_min, d.tm_sec, - ns % NSEC_PER_SEC) + d = time.localtime(ns / NSEC_PER_SEC) + return "%02d:%02d:%02d.%09d" % ( + d.tm_hour, + d.tm_min, + d.tm_sec, + ns % NSEC_PER_SEC, + ) def parse(self): # iterate over all the events @@ -59,7 +66,8 @@ class TraceParser: continue method_name = "handle_%s" % msg.event.name.replace(":", "_").replace( - "+", "_") + "+", "_" + ) # call the function to handle each event individually if hasattr(TraceParser, method_name): func = getattr(TraceParser, method_name) @@ -228,13 +236,13 @@ class TraceParser: pass -class Test1(TraceParser): +class WorkingCases(TraceParser): def __init__(self, trace, validation_args): - super().__init__(trace, validation_args['pid']) + super().__init__(trace, validation_args["pid"]) # Values expected in the trace - self.epoll_wait_fd = validation_args['epoll_wait_fd'] - self.epoll_pwait_fd = validation_args['epoll_pwait_fd'] + self.epoll_wait_fd = validation_args["epoll_wait_fd"] + self.epoll_pwait_fd = validation_args["epoll_pwait_fd"] self.expect["select_entry"]["select_in_fd0"] = 0 self.expect["select_entry"]["select_in_fd1023"] = 0 @@ -263,8 +271,12 @@ class Test1(TraceParser): exceptfd_127 = event["exceptfds"][127] # check that the FD 1023 is actually set in the readfds - if readfd_127 == 0x40 and writefd_127 == 0 and \ - exceptfd_127 == 0 and overflow == 0: + if ( + readfd_127 == 0x40 + and writefd_127 == 0 + and exceptfd_127 == 0 + and overflow == 0 + ): self.expect["select_entry"]["select_in_fd1023"] = 1 # Save values of local variables to print in case of test failure @@ -287,8 +299,12 @@ class Test1(TraceParser): readfd_127 = event["readfds"][127] writefd_127 = event["writefds"][127] exceptfd_127 = event["exceptfds"][127] - if readfd_127 == 0x40 and writefd_127 == 0 and \ - exceptfd_127 == 0 and tvp == 0: + if ( + readfd_127 == 0x40 + and writefd_127 == 0 + and exceptfd_127 == 0 + and tvp == 0 + ): self.expect["select_exit"]["select_out_fd1023"] = 1 # Save values of local variables to print in case of test failure @@ -303,8 +319,11 @@ class Test1(TraceParser): # the raw value matches the events bit field. if nfds == 1 and fds_length == 1: fd_0 = event["fds"][0] - if fd_0["raw_events"] == 0x3 and fd_0["events"]["POLLIN"] == 1 and \ - fd_0["events"]["padding"] == 0: + if ( + fd_0["raw_events"] == 0x3 + and fd_0["events"]["POLLIN"] == 1 + and fd_0["events"]["padding"] == 0 + ): self.expect["poll_entry"]["poll_in_nfds1"] = 1 # Save values of local variables to print in case of test failure @@ -318,8 +337,11 @@ class Test1(TraceParser): # the raw value matches the events bit field. if ret == 1 and fds_length == 1: fd_0 = event["fds"][0] - if fd_0["raw_events"] == 0x1 and fd_0["events"]["POLLIN"] == 1 and \ - fd_0["events"]["padding"] == 0: + if ( + fd_0["raw_events"] == 0x1 + and fd_0["events"]["POLLIN"] == 1 + and fd_0["events"]["padding"] == 0 + ): self.expect["poll_exit"]["poll_out_nfds1"] = 1 # Save values of local variables to print in case of test failure @@ -333,10 +355,14 @@ class Test1(TraceParser): # check that we have FD 0 waiting for EPOLLIN|EPOLLPRI and that # data.fd = 0 - if (epfd == self.epoll_wait_fd or epfd == self.epoll_pwait_fd) and 'EPOLL_CTL_ADD' in op_enum.labels and fd == 0 and \ - _event["data_union"]["fd"] == 0 and \ - _event["events"]["EPOLLIN"] == 1 and \ - _event["events"]["EPOLLPRI"] == 1: + if ( + (epfd == self.epoll_wait_fd or epfd == self.epoll_pwait_fd) + and "EPOLL_CTL_ADD" in op_enum.labels + and fd == 0 + and _event["data_union"]["fd"] == 0 + and _event["events"]["EPOLLIN"] == 1 + and _event["events"]["EPOLLPRI"] == 1 + ): self.expect["epoll_ctl_entry"]["epoll_ctl_in_add"] = 1 # Save values of local variables to print in case of test failure @@ -370,8 +396,11 @@ class Test1(TraceParser): # check that FD 0 returned with EPOLLIN and the right data.fd if ret == 1 and fds_length == 1: fd_0 = event["fds"][0] - if overflow == 0 and fd_0["data_union"]["fd"] == 0 and \ - fd_0["events"]["EPOLLIN"] == 1: + if ( + overflow == 0 + and fd_0["data_union"]["fd"] == 0 + and fd_0["events"]["EPOLLIN"] == 1 + ): self.expect["epoll_wait_exit"]["epoll_wait_out_fd0"] = 1 # Save values of local variables to print in case of test failure @@ -396,16 +425,20 @@ class Test1(TraceParser): # check that FD 0 returned with EPOLLIN and the right data.fd if ret == 1 and fds_length == 1: fd_0 = event["fds"][0] - if overflow == 0 and fd_0["data_union"]["fd"] == 0 and \ - fd_0["events"]["EPOLLIN"] == 1: + if ( + overflow == 0 + and fd_0["data_union"]["fd"] == 0 + and fd_0["events"]["EPOLLIN"] == 1 + ): self.expect["epoll_pwait_exit"]["epoll_pwait_out_fd0"] = 1 # Save values of local variables to print in case of test failure self.recorded_values["epoll_pwait_exit"] = locals() -class Test2(TraceParser): + +class WorkingCasesTimeout(TraceParser): def __init__(self, trace, validation_args): - super().__init__(trace, validation_args['pid']) + super().__init__(trace, validation_args["pid"]) self.expect["select_entry"]["select_timeout_in_fd0"] = 0 self.expect["select_entry"]["select_timeout_in_fd1023"] = 0 self.expect["select_exit"]["select_timeout_out"] = 0 @@ -427,8 +460,12 @@ class Test2(TraceParser): writefd_127 = event["writefds"][127] exceptfd_127 = event["exceptfds"][127] - if readfd_127 == 0x40 and writefd_127 == 0 and \ - exceptfd_127 == 0 and tvp != 0: + if ( + readfd_127 == 0x40 + and writefd_127 == 0 + and exceptfd_127 == 0 + and tvp != 0 + ): self.expect["select_entry"]["select_timeout_in_fd1023"] = 1 # Save values of local variables to print in case of test failure @@ -452,9 +489,11 @@ class Test2(TraceParser): # field matches the value of POLLIN if nfds == 1 and fds_length == 1: fd_0 = event["fds"][0] - if fd_0["raw_events"] == 0x3 and \ - fd_0["events"]["POLLIN"] == 1 and \ - fd_0["events"]["padding"] == 0: + if ( + fd_0["raw_events"] == 0x3 + and fd_0["events"]["POLLIN"] == 1 + and fd_0["events"]["padding"] == 0 + ): self.expect["poll_entry"]["poll_timeout_in"] = 1 # Save values of local variables to print in case of test failure @@ -476,9 +515,11 @@ class Test2(TraceParser): _event = event["event"] # make sure we see a EPOLLIN|EPOLLPRI - if 'EPOLL_CTL_ADD' in op_enum.labels and \ - _event["events"]["EPOLLIN"] == 1 and \ - _event["events"]["EPOLLPRI"] == 1: + if ( + "EPOLL_CTL_ADD" in op_enum.labels + and _event["events"]["EPOLLIN"] == 1 + and _event["events"]["EPOLLPRI"] == 1 + ): self.expect["epoll_ctl_entry"]["epoll_ctl_timeout_in_add"] = 1 # Save values of local variables to print in case of test failure @@ -515,9 +556,9 @@ class Test2(TraceParser): self.recorded_values["epoll_wait_exit"] = locals() -class Test3(TraceParser): +class PselectInvalidFd(TraceParser): def __init__(self, trace, validation_args): - super().__init__(trace, validation_args['pid']) + super().__init__(trace, validation_args["pid"]) self.expect["select_entry"]["select_invalid_fd_in"] = 0 self.expect["select_exit"]["select_invalid_fd_out"] = 0 @@ -544,9 +585,9 @@ class Test3(TraceParser): self.recorded_values["select_exit"] = locals() -class Test4(TraceParser): +class PpollBig(TraceParser): def __init__(self, trace, validation_args): - super().__init__(trace, validation_args['pid']) + super().__init__(trace, validation_args["pid"]) self.expect["poll_entry"]["big_poll_in"] = 0 self.expect["poll_exit"]["big_poll_out"] = 0 @@ -559,10 +600,13 @@ class Test4(TraceParser): if nfds == 2047 and fds_length == 512 and overflow == 1: fd_0 = event["fds"][0] fd_511 = event["fds"][511] - if fd_0["raw_events"] == 0x3 and fd_0["events"]["POLLIN"] == 1 and \ - fd_0["events"]["padding"] == 0 and \ - fd_511["events"]["POLLIN"] == 1 and \ - fd_511["events"]["POLLPRI"] == 1: + if ( + fd_0["raw_events"] == 0x3 + and fd_0["events"]["POLLIN"] == 1 + and fd_0["events"]["padding"] == 0 + and fd_511["events"]["POLLIN"] == 1 + and fd_511["events"]["POLLPRI"] == 1 + ): self.expect["poll_entry"]["big_poll_in"] = 1 # Save values of local variables to print in case of test failure @@ -576,17 +620,18 @@ class Test4(TraceParser): # test of big list of FDs and the behaviour of the overflow if ret == 2047 and nfds == 2047 and fds_length == 512 and overflow == 1: - fd_0 = event["fds"][0] - fd_511 = event["fds"][511] - if fd_0["events"]["POLLIN"] == 1 and fd_511["events"]["POLLIN"] == 1: - self.expect["poll_exit"]["big_poll_out"] = 1 + fd_0 = event["fds"][0] + fd_511 = event["fds"][511] + if fd_0["events"]["POLLIN"] == 1 and fd_511["events"]["POLLIN"] == 1: + self.expect["poll_exit"]["big_poll_out"] = 1 # Save values of local variables to print in case of test failure self.recorded_values["poll_exit"] = locals() -class Test5(TraceParser): + +class PpollFdsBufferOverflow(TraceParser): def __init__(self, trace, validation_args): - super().__init__(trace, validation_args['pid']) + super().__init__(trace, validation_args["pid"]) self.expect["poll_entry"]["poll_overflow_in"] = 0 self.expect["poll_exit"]["poll_overflow_out"] = 0 @@ -618,9 +663,9 @@ class Test5(TraceParser): self.recorded_values["poll_exit"] = locals() -class Test6(TraceParser): +class PselectInvalidPointer(TraceParser): def __init__(self, trace, validation_args): - super().__init__(trace, validation_args['pid']) + super().__init__(trace, validation_args["pid"]) self.expect["select_entry"]["pselect_invalid_in"] = 0 self.expect["select_exit"]["pselect_invalid_out"] = 0 @@ -651,9 +696,9 @@ class Test6(TraceParser): self.recorded_values["select_exit"] = locals() -class Test7(TraceParser): +class PpollFdsULongMax(TraceParser): def __init__(self, trace, validation_args): - super().__init__(trace, validation_args['pid']) + super().__init__(trace, validation_args["pid"]) self.expect["poll_entry"]["poll_max_in"] = 0 self.expect["poll_exit"]["poll_max_out"] = 0 @@ -668,7 +713,6 @@ class Test7(TraceParser): # Save values of local variables to print in case of test failure self.recorded_values["poll_entry"] = locals() - def poll_exit(self, event): ret = event["ret"] nfds = event["nfds"] @@ -682,12 +726,12 @@ class Test7(TraceParser): self.recorded_values["poll_exit"] = locals() -class Test8(TraceParser): +class EpollPwaitInvalidPointer(TraceParser): def __init__(self, trace, validation_args): - super().__init__(trace, validation_args['pid']) + super().__init__(trace, validation_args["pid"]) # Values expected in the trace - self.epoll_fd = validation_args['epollfd'] + self.epoll_fd = validation_args["epollfd"] self.expect["epoll_wait_entry"]["epoll_wait_invalid_in"] = 0 self.expect["epoll_wait_exit"]["epoll_wait_invalid_out"] = 0 @@ -719,12 +763,12 @@ class Test8(TraceParser): self.recorded_values["epoll_wait_exit"] = locals() -class Test9(TraceParser): +class EpollPwaitIntMax(TraceParser): def __init__(self, trace, validation_args): - super().__init__(trace, validation_args['pid']) + super().__init__(trace, validation_args["pid"]) # Values expected in the trace - self.epoll_fd = validation_args['epollfd'] + self.epoll_fd = validation_args["epollfd"] self.expect["epoll_wait_entry"]["epoll_wait_max_in"] = 0 self.expect["epoll_wait_exit"]["epoll_wait_max_out"] = 0 @@ -755,10 +799,12 @@ class Test9(TraceParser): if __name__ == "__main__": - parser = argparse.ArgumentParser(description='Trace parser') - parser.add_argument('path', metavar="", help='Trace path') - parser.add_argument('-t', '--test', type=int, help='Test to validate') - parser.add_argument('-o', '--validation-file', type=str, help='Validation file path') + parser = argparse.ArgumentParser(description="Trace parser") + parser.add_argument("path", metavar="", help="Trace path") + parser.add_argument("-t", "--test", type=str, help="Test to validate") + parser.add_argument( + "-o", "--validation-file", type=str, help="Validation file path" + ) args = parser.parse_args() if not args.test: @@ -775,33 +821,33 @@ if __name__ == "__main__": try: test_validation_args = json.load(f) except Exception as e: - print('Failed to parse validation file: ' + str(e)) + print("Failed to parse validation file: " + str(e)) sys.exit(1) t = None - if args.test == 1: - t = Test1(traces, test_validation_args) - elif args.test == 2: - t = Test2(traces, test_validation_args) - elif args.test == 3: - t = Test3(traces, test_validation_args) - elif args.test == 4: - t = Test4(traces, test_validation_args) - elif args.test == 5: - t = Test5(traces, test_validation_args) - elif args.test == 6: - t = Test6(traces, test_validation_args) - elif args.test == 7: - t = Test7(traces, test_validation_args) - elif args.test == 8: - t = Test8(traces, test_validation_args) - elif args.test == 9: - t = Test9(traces, test_validation_args) - elif args.test == 10: + if args.test == "working_cases": + t = WorkingCases(traces, test_validation_args) + elif args.test == "working_cases_timeout": + t = WorkingCasesTimeout(traces, test_validation_args) + elif args.test == "pselect_invalid_fd": + t = PselectInvalidFd(traces, test_validation_args) + elif args.test == "ppoll_big": + t = PpollBig(traces, test_validation_args) + elif args.test == "ppoll_fds_buffer_overflow": + t = PpollFdsBufferOverflow(traces, test_validation_args) + elif args.test == "pselect_invalid_pointer": + t = PselectInvalidPointer(traces, test_validation_args) + elif args.test == "ppoll_fds_ulong_max": + t = PpollFdsULongMax(traces, test_validation_args) + elif args.test == "epoll_pwait_invalid_pointer": + t = EpollPwaitInvalidPointer(traces, test_validation_args) + elif args.test == "epoll_pwait_int_max": + t = EpollPwaitIntMax(traces, test_validation_args) + elif args.test == "ppoll_concurrent_write": # stress test, nothing reliable to check ret = 0 - elif args.test == 11: + elif args.test == "epoll_pwait_concurrent_munmap": # stress test, nothing reliable to check ret = 0 else: