[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