Commit 4d705e72 authored by Ruslan Kuprieiev's avatar Ruslan Kuprieiev Committed by Pavel Emelyanov

test: crit: enhance test process

Use mature technics to organize test process.
Signed-off-by: 's avatarRuslan Kuprieiev <kupruser@gmail.com>
Reported-by: 's avatarAndrey Vagin <avagin@openvz.org>
Signed-off-by: 's avatarPavel Emelyanov <xemul@parallels.com>
parent 692ed6e1
...@@ -2,6 +2,7 @@ all: test-c rpc_pb2.py ...@@ -2,6 +2,7 @@ all: test-c rpc_pb2.py
.PHONY: all .PHONY: all
run: all run: all
mkdir -p build
./run.sh ./run.sh
test-c: rpc.pb-c.o test.o test-c: rpc.pb-c.o test.o
......
...@@ -2,25 +2,25 @@ ...@@ -2,25 +2,25 @@
# Test criu errno # Test criu errno
import socket, os, imp, sys, errno import socket, os, imp, sys, errno
p = os.getcwd()
sys.path.append(p)
import rpc_pb2 as rpc import rpc_pb2 as rpc
import argparse
parser = argparse.ArgumentParser(description="Test errno reported by CRIU RPC")
parser.add_argument('socket', type = str, help = "CRIU service socket")
parser.add_argument('dir', type = str, help = "Directory where CRIU images should be placed")
args = vars(parser.parse_args())
# Prepare dir for images # Prepare dir for images
class test: class test:
def __init__(self): def __init__(self):
imgs_path = "imgs_errno" self.imgs_fd = os.open(args['dir'], os.O_DIRECTORY)
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.s = -1
self._MAX_MSG_SIZE = 1024 self._MAX_MSG_SIZE = 1024
def connect(self): def connect(self):
self.s = socket.socket(socket.AF_UNIX, socket.SOCK_SEQPACKET) self.s = socket.socket(socket.AF_UNIX, socket.SOCK_SEQPACKET)
self.s.connect('criu_service.socket') self.s.connect(args['socket'])
def get_base_req(self): def get_base_req(self):
req = rpc.criu_req() req = rpc.criu_req()
......
#!/usr/bin/python #!/usr/bin/python
import socket, os, imp, sys import socket, os, imp, sys
p = os.getcwd()
sys.path.append(p)
import rpc_pb2 as rpc import rpc_pb2 as rpc
import argparse
parser = argparse.ArgumentParser(description="Test page-server using CRIU RPC")
parser.add_argument('socket', type = str, help = "CRIU service socket")
parser.add_argument('dir', type = str, help = "Directory where CRIU images should be placed")
args = vars(parser.parse_args())
# Connect to service socket # Connect to service socket
s = socket.socket(socket.AF_UNIX, socket.SOCK_SEQPACKET) s = socket.socket(socket.AF_UNIX, socket.SOCK_SEQPACKET)
s.connect('criu_service.socket') s.connect(args['socket'])
# Start page-server # Start page-server
print 'Starting page-server' print 'Starting page-server'
...@@ -16,11 +20,7 @@ req = rpc.criu_req() ...@@ -16,11 +20,7 @@ req = rpc.criu_req()
req.type = rpc.PAGE_SERVER req.type = rpc.PAGE_SERVER
req.opts.log_file = 'page-server.log' req.opts.log_file = 'page-server.log'
req.opts.log_level = 4 req.opts.log_level = 4
req.opts.images_dir_fd = os.open(args['dir'], os.O_DIRECTORY)
if not os.path.exists('ps_test'):
os.makedirs('ps_test')
req.opts.images_dir_fd = os.open('ps_test', os.O_DIRECTORY)
s.send(req.SerializeToString()) s.send(req.SerializeToString())
...@@ -58,7 +58,7 @@ req.opts.leave_running = True ...@@ -58,7 +58,7 @@ req.opts.leave_running = True
s.close() s.close()
s = socket.socket(socket.AF_UNIX, socket.SOCK_SEQPACKET) s = socket.socket(socket.AF_UNIX, socket.SOCK_SEQPACKET)
s.connect('criu_service.socket') s.connect(args['socket'])
s.send(req.SerializeToString()) s.send(req.SerializeToString())
resp.ParseFromString(s.recv(MAX_MSG_SIZE)) resp.ParseFromString(s.recv(MAX_MSG_SIZE))
......
#!/usr/bin/python #!/usr/bin/python
import socket, os, imp, sys import socket, os, imp, sys
p = os.getcwd()
sys.path.append(p)
import rpc_pb2 as rpc import rpc_pb2 as rpc
import argparse
parser = argparse.ArgumentParser(description="Test ability to restore a process from images using CRIU RPC")
parser.add_argument('socket', type = str, help = "CRIU service socket")
parser.add_argument('dir', type = str, help = "Directory where CRIU images could be found")
args = vars(parser.parse_args())
# Connect to service socket # Connect to service socket
s = socket.socket(socket.AF_UNIX, socket.SOCK_SEQPACKET) s = socket.socket(socket.AF_UNIX, socket.SOCK_SEQPACKET)
s.connect('criu_service.socket') s.connect(args['socket'])
# Create criu msg, set it's type to dump request # Create criu msg, set it's type to dump request
# and set dump options. Checkout more options in protobuf/rpc.proto # and set dump options. Checkout more options in protobuf/rpc.proto
req = rpc.criu_req() req = rpc.criu_req()
req.type = rpc.RESTORE req.type = rpc.RESTORE
req.opts.images_dir_fd = os.open(args['dir'], os.O_DIRECTORY)
req.opts.images_dir_fd = os.open('imgs_loop', os.O_DIRECTORY)
# Send request # Send request
s.send(req.SerializeToString()) s.send(req.SerializeToString())
......
#!/bin/bash #!/bin/bash
set -e
source ../env.sh || exit 1 source ../env.sh || exit 1
export PROTODIR=`readlink -f "${PWD}/../../protobuf"` export PROTODIR=`readlink -f "${PWD}/../../protobuf"`
...@@ -13,61 +15,76 @@ function title_print { ...@@ -13,61 +15,76 @@ function title_print {
} }
function _exit { function start_server {
if [ $1 -ne 0 ]; then title_print "Start service server"
echo "FAIL" ${CRIU} service -v4 -W build -o service.log --address criu_service.socket -d --pidfile pidfile
fi }
function stop_server {
title_print "Shutdown service server" title_print "Shutdown service server"
kill -SIGTERM `cat pidfile` kill -SIGTERM $(cat build/pidfile)
}
exit $1 function test_c {
mkdir -p build/imgs_c
title_print "Run test-c"
./test-c build/criu_service.socket build/imgs_c
title_print "Restore test-c"
${CRIU} restore -v4 -o restore-c.log -D build/imgs_c --shell-job
} }
function check_and_term { function test_py {
title_print "Check and term $1" mkdir -p build/imgs_py
ps -C $1
pkill $1 title_print "Run test-py"
./test.py build/criu_service.socket build/imgs_py
title_print "Restore test-py"
${CRIU} restore -v4 -o restore-py.log -D build/imgs_py --shell-job
} }
title_print "Build programs" function test_restore_loop {
make clean mkdir -p build/imgs_loop
mkdir build
cd build
make -C ../ || { echo "FAIL"; exit 1; }
title_print "Start service server" title_print "Run loop.sh"
${CRIU} service -v4 -o service.log --address criu_service.socket -d --pidfile `pwd`/pidfile || { echo "FAIL"; exit 1; } setsid ./loop.sh < /dev/null &> build/loop.log &
P=${!}
echo "pid ${P}"
title_print "Run test-c" title_print "Dump loop.sh"
../test-c || _exit $? ${CRIU} dump -v4 -o dump-loop.log -D build/imgs_loop -t ${P}
title_print "Run test-py" title_print "Run restore-loop"
../test.py || _exit $? ./restore-loop.py build/criu_service.socket build/imgs_loop
kill -SIGTERM ${P}
}
title_print "Restore test-c" function test_ps {
${CRIU} restore -v4 -o restore-c.log -D imgs_c --shell-job || _exit $? mkdir -p build/imgs_ps
title_print "Restore test-py" title_print "Run ps_test"
${CRIU} restore -v4 -o restore-py.log -D imgs_py --shell-job || _exit $? ./ps_test.py build/criu_service.socket build/imgs_ps
}
title_print "Run loop.sh" function test_errno {
setsid ../loop.sh < /dev/null &> loop.log & mkdir -p build/imgs_errno
P=${!}
echo "pid ${P}" title_print "Run cr_errno test"
./errno.py build/criu_service.socket build/imgs_errno
}
title_print "Dump loop.sh" trap 'echo "FAIL"; stop_server' EXIT
mkdir imgs_loop
${CRIU} dump -v4 -o dump-loop.log -D imgs_loop -t ${P} || _exit $?
title_print "Run restore-loop" start_server
../restore-loop.py || _exit $?
kill -SIGTERM ${P}
title_print "Run ps_test" test_c
../ps_test.py || _exit $? test_py
test_restore_loop
test_ps
test_errno
title_print "Run cr_errno test" stop_server
../errno.py || _exit $?
_exit 0 trap 'echo "Success"' EXIT
...@@ -50,7 +50,7 @@ static int send_req(int socket_fd, CriuReq *req) ...@@ -50,7 +50,7 @@ static int send_req(int socket_fd, CriuReq *req)
return 0; return 0;
} }
int main() int main(int argc, char *argv[])
{ {
CriuReq req = CRIU_REQ__INIT; CriuReq req = CRIU_REQ__INIT;
CriuResp *resp = NULL; CriuResp *resp = NULL;
...@@ -60,22 +60,20 @@ int main() ...@@ -60,22 +60,20 @@ int main()
socklen_t addr_len; socklen_t addr_len;
struct stat st = {0}; struct stat st = {0};
if (argc != 3) {
fprintf(stderr, "Usage: test-c criu-service.socket imgs_dir");
return -1;
}
/* /*
* Open a directory, in which criu will * Open a directory, in which criu will
* put images * put images
*/ */
umask(0);
if (stat("imgs_c", &st)) {
if (mkdir("imgs_c", 0666)) {
perror("Can't create dir");
return -1;
}
}
dir_fd = open("imgs_c", O_DIRECTORY); puts(argv[2]);
dir_fd = open(argv[2], O_DIRECTORY);
if (dir_fd == -1) { if (dir_fd == -1) {
perror("Can't open dir"); perror("Can't open imgs dir");
return -1; return -1;
} }
...@@ -116,7 +114,7 @@ int main() ...@@ -116,7 +114,7 @@ int main()
memset(&addr, 0, sizeof(addr)); memset(&addr, 0, sizeof(addr));
addr.sun_family = AF_LOCAL; addr.sun_family = AF_LOCAL;
strcpy(addr.sun_path, "criu_service.socket"); strcpy(addr.sun_path, argv[1]);
addr_len = strlen(addr.sun_path) + sizeof(addr.sun_family); addr_len = strlen(addr.sun_path) + sizeof(addr.sun_family);
......
#!/usr/bin/python #!/usr/bin/python
import socket, os, imp, sys import socket, os, imp, sys
p = os.getcwd()
sys.path.append(p)
import rpc_pb2 as rpc import rpc_pb2 as rpc
import argparse
parser = argparse.ArgumentParser(description="Test dump/restore using CRIU RPC")
parser.add_argument('socket', type = str, help = "CRIU service socket")
parser.add_argument('dir', type = str, help = "Directory where CRIU images should be placed")
args = vars(parser.parse_args())
# Connect to service socket # Connect to service socket
s = socket.socket(socket.AF_UNIX, socket.SOCK_SEQPACKET) s = socket.socket(socket.AF_UNIX, socket.SOCK_SEQPACKET)
s.connect('criu_service.socket') s.connect(args['socket'])
# Create criu msg, set it's type to dump request # Create criu msg, set it's type to dump request
# and set dump options. Checkout more options in protobuf/rpc.proto # and set dump options. Checkout more options in protobuf/rpc.proto
...@@ -17,11 +21,7 @@ req.type = rpc.DUMP ...@@ -17,11 +21,7 @@ req.type = rpc.DUMP
req.opts.leave_running = True req.opts.leave_running = True
req.opts.shell_job = True req.opts.shell_job = True
req.opts.log_level = 4 req.opts.log_level = 4
req.opts.images_dir_fd = os.open(args['dir'], os.O_DIRECTORY)
if not os.path.exists('imgs_py'):
os.makedirs('imgs_py')
req.opts.images_dir_fd = os.open('imgs_py', os.O_DIRECTORY)
# Send request # Send request
s.send(req.SerializeToString()) s.send(req.SerializeToString())
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment