[CRIU] [PATCH 8/8] test: rpc: cr_errno
Ruslan Kuprieiev
kupruser at gmail.com
Mon Dec 1 14:52:43 PST 2014
Lets simulate some errors and check what
error will be returned by service.
Signed-off-by: Ruslan Kuprieiev <kupruser at gmail.com>
---
test/rpc/errno.py | 133 ++++++++++++++++++++++++++++++++++++++++++++++++++++++
test/rpc/run.sh | 3 ++
2 files changed, 136 insertions(+)
create mode 100755 test/rpc/errno.py
diff --git a/test/rpc/errno.py b/test/rpc/errno.py
new file mode 100755
index 0000000..32357f0
--- /dev/null
+++ b/test/rpc/errno.py
@@ -0,0 +1,133 @@
+#!/usr/bin/python
+# Test criu errno
+
+import socket, os, imp, sys, errno
+
+p = os.getcwd()
+sys.path.append(p)
+import rpc_pb2 as rpc
+
+
+# Prepare dir for images
+class test:
+ def __init__(self):
+ imgs_path = "imgs_errno"
+ if not os.path.exists(imgs_path):
+ os.makedirs(imgs_path)
+ self.imgs_fd = os.open(imgs_path, os.O_DIRECTORY)
+ self.s = -1
+ self._MAX_MSG_SIZE = 1024
+
+ def connect(self):
+ self.s = socket.socket(socket.AF_UNIX, socket.SOCK_SEQPACKET)
+ self.s.connect('criu_service.socket')
+
+ def get_base_req(self):
+ req = rpc.criu_req()
+ req.opts.log_level = 4
+ req.opts.images_dir_fd = self.imgs_fd
+ return req
+
+ def send_req(self, req):
+ self.connect()
+ self.s.send(req.SerializeToString())
+
+ def recv_resp(self):
+ resp = rpc.criu_resp()
+ resp.ParseFromString(self.s.recv(self._MAX_MSG_SIZE))
+ return resp
+
+ def check_cr_errno(self, resp, err):
+ if resp.success:
+ raise Exception('Unexpected success = True')
+ else:
+ if resp.cr_errno != err:
+ raise Exception('Unexpected cr_errno ' + str(resp.cr_errno))
+
+ def no_process(self):
+ print 'Try to dump unexisting process'
+ # Get pid of non-existing process.
+ # Suppose max_pid is not taken by any process.
+ with open("/proc/sys/kernel/pid_max", "r") as f:
+ pid = int(f.readline())
+ try:
+ os.kill(pid, 0)
+ except OSError:
+ pass
+ else:
+ raise Exception('max pid is taken')
+
+ # Ask criu to dump non-existing process.
+ req = self.get_base_req()
+ req.type = rpc.DUMP
+ req.opts.pid = pid
+
+ self.send_req(req)
+ resp = self.recv_resp()
+
+ self.check_cr_errno(resp, errno.ESRCH)
+
+ print 'Success'
+
+ def process_exists(self):
+ print 'Try to restore process which pid is already taken by other process'
+
+ # Perform self-dump
+ req = self.get_base_req()
+ req.type = rpc.DUMP
+ req.opts.shell_job = True
+ req.opts.leave_running = True
+
+ self.send_req(req)
+ resp = self.recv_resp()
+
+ if resp.success != True:
+ raise Exception('Self-dump failed')
+
+ # Ask to restore process from images of ourselves
+ req = self.get_base_req()
+ req.type = rpc.RESTORE
+
+ self.send_req(req)
+ resp = self.recv_resp()
+
+ self.check_cr_errno(resp, errno.EEXIST)
+
+ print 'Success'
+
+ def bad_options(self):
+ print 'Try to send criu invalid opts'
+
+ # Subdirs are not allowed in log_file
+ req = self.get_base_req()
+ req.type = rpc.DUMP
+ req.opts.log_file = "../file.log"
+
+ self.send_req(req)
+ resp = self.recv_resp()
+
+ self.check_cr_errno(resp, errno.EINVAL)
+
+ print 'Success'
+
+ def bad_request(self):
+ print 'Try to send criu invalid request type'
+
+ req = self.get_base_req()
+ req.type = rpc.NOTIFY
+
+ self.send_req(req)
+ resp = self.recv_resp()
+
+ self.check_cr_errno(resp, errno.EBADRQC)
+
+ print 'Success'
+
+ def run(self):
+ self.no_process()
+ self.process_exists()
+ self.bad_options()
+ self.bad_request()
+
+t = test()
+t.run()
diff --git a/test/rpc/run.sh b/test/rpc/run.sh
index 896d472..b9455f6 100755
--- a/test/rpc/run.sh
+++ b/test/rpc/run.sh
@@ -67,4 +67,7 @@ kill -SIGTERM ${P}
title_print "Run ps_test"
../ps_test.py || _exit $?
+title_print "Run cr_errno test"
+../errno.py || _exit $?
+
_exit 0
--
1.9.3
More information about the CRIU
mailing list