[CRIU] [PATCH 4/4] test: A simple test for criu_restore_sub call
Andrew Vagin
avagin at parallels.com
Mon Jun 23 00:13:15 PDT 2014
On Tue, Jun 17, 2014 at 09:11:29PM +0400, Pavel Emelyanov wrote:
> Which is at the same time the demonstration of how to do the trick.
>
> Signed-off-by: Pavel Emelyanov <xemul at parallels.com>
> ---
> test/libcriu/Makefile | 10 +++++--
> test/libcriu/run_sub.sh | 32 ++++++++++++++++++++
> test/libcriu/test_sub.c | 78 +++++++++++++++++++++++++++++++++++++++++++++++++
> 3 files changed, 118 insertions(+), 2 deletions(-)
> create mode 100644 test/libcriu/run_sub.sh
> create mode 100644 test/libcriu/test_sub.c
>
> diff --git a/test/libcriu/Makefile b/test/libcriu/Makefile
> index a1af1f5..474f3d1 100644
> --- a/test/libcriu/Makefile
> +++ b/test/libcriu/Makefile
> @@ -1,6 +1,12 @@
> -all: build/test
> +all: build/test test_sub
> .PHONY: all
>
> +test_sub: test_sub.o
> + gcc $^ -L ../../lib -lcriu -o $@
> +
> +test_sub.o: test_sub.c
> + gcc -c $^ -I ../../lib -o $@
> +
> build/test: build/test.o
> gcc $^ -L ../../lib -lcriu -o $@
>
> @@ -8,5 +14,5 @@ build/test.o: test.c
> gcc -c $^ -I ../../lib -o $@
>
> clean:
> - rm -rf build
> + rm -rf build test_sub test_sub.o
> .PHONY: clean
> diff --git a/test/libcriu/run_sub.sh b/test/libcriu/run_sub.sh
> new file mode 100644
> index 0000000..ca2f9e2
> --- /dev/null
> +++ b/test/libcriu/run_sub.sh
> @@ -0,0 +1,32 @@
> +#!/bin/bash
> +
> +source ../env.sh || exit 1
> +
> +LOOP_PID=0
> +
> +echo "== Clean"
> +make clean
> +rm -rf wdir
> +rm -f ./libcriu.so.1
> +
> +echo "== Prepare"
> +make test_sub || { echo "FAIL"; exit 1; }
> +
> +mkdir -p wdir/s/
> +mkdir -p wdir/i/
> +echo "== Start service"
> +${CRIU} service -v4 -o service.log --address cs.sk -d --pidfile pidfile -W wdir/s/ || { echo "FAIL"; exit 1; }
> +
> +echo "== Run loop.sh"
> +setsid ./loop.sh < /dev/null &> loop.log &
> +LOOP_PID=${!}
> +echo "pid ${LOOP_PID}"
> +
> +echo "== Run test_sub"
> +ln -s ../../lib/libcriu.so libcriu.so.1
> +export LD_LIBRARY_PATH=.
> +export PATH="`dirname ${BASH_SOURCE[0]}`/../../:$PATH"
> +./test_sub ${LOOP_PID} wdir/s/cs.sk wdir/i/
> +
> +echo "== Stopping service"
> +kill -TERM $(cat wdir/s/pidfile)
> diff --git a/test/libcriu/test_sub.c b/test/libcriu/test_sub.c
> new file mode 100644
> index 0000000..7a1b3c9
> --- /dev/null
> +++ b/test/libcriu/test_sub.c
> @@ -0,0 +1,78 @@
> +#include "criu.h"
> +#include <fcntl.h>
> +#include <stdio.h>
> +#include <errno.h>
> +#include <stdlib.h>
> +
> +static void what_err_ret_mean(ret)
> +{
> + /* NOTE: errno is set by libcriu */
> + switch (ret) {
> + case -EBADE:
> + perror("RPC has returned fail");
> + break;
> + case -ECONNREFUSED:
> + perror("Unable to connect to CRIU");
> + break;
> + case -ECOMM:
> + perror("Unable to send/recv msg to/from CRIU");
> + break;
> + case -EINVAL:
> + perror("CRIU doesn't support this type of request."
> + "You should probably update CRIU");
> + break;
> + case -EBADMSG:
> + perror("Unexpected response from CRIU."
> + "You should probably update CRIU");
> + break;
> + default:
> + perror("Unknown error type code."
> + "You should probably update CRIU");
> + }
> +}
> +
> +int main(int argc, char **argv)
> +{
> + int ret, fd;
> +
> + printf("--- Dump loop ---\n");
> + criu_init_opts();
> + criu_set_service_address(argv[2]);
> + criu_set_pid(atoi(argv[1]));
> + criu_set_log_file("dump.log");
> + criu_set_log_level(4);
> + fd = open(argv[3], O_DIRECTORY);
> + criu_set_images_dir_fd(fd);
> +
> + ret = criu_dump();
> + if (ret < 0) {
> + what_err_ret_mean(ret);
> + return -1;
> + } else if (ret == 0)
> + printf(" `- Success\n");
> +
> + sleep(1); /* Ugly -- wait for pid from dump to free */
I don't understand why do we need this sleep. I afraid it will be failed
in jenkins and it's a bad demonstration of how to do the trick ;)
> +
> + printf("--- Restore loop ---\n");
> + criu_init_opts();
> + criu_set_log_level(4);
> + criu_set_log_file("restore.log");
> + criu_set_images_dir_fd(fd);
> +
> + printf("PATH=%s\n", getenv("PATH"));
> + ret = criu_restore_sub();
> + if (ret <= 0) {
> + what_err_ret_mean(ret);
> + return -1;
> + }
> +
> + printf(" Restore returned pid %d\n", ret);
> + kill(ret, 9);
You need to check return code here, otherwise you can't be sure that a
process don't die w/o your help.
> + if (waitpid(ret, NULL, 0) < 0) {
> + perror(" Can't wait kid");
> + return -1;
> + }
> +
> + printf(" `- Success\n");
> + return 0;
> +}
> --
> 1.8.4.2
> _______________________________________________
> CRIU mailing list
> CRIU at openvz.org
> https://lists.openvz.org/mailman/listinfo/criu
More information about the CRIU
mailing list