mirror of
https://github.com/checkpoint-restore/criu.git
synced 2026-01-23 02:14:37 +00:00
tests: added test for single pre-dump support
Signed-off-by: Adrian Reber <areber@redhat.com>
This commit is contained in:
parent
51a1adbc03
commit
af4b265193
8 changed files with 156 additions and 6 deletions
1
test/others/libcriu/.gitignore
vendored
1
test/others/libcriu/.gitignore
vendored
|
|
@ -4,5 +4,6 @@ test_notify
|
|||
test_self
|
||||
test_sub
|
||||
test_join_ns
|
||||
test_pre_dump
|
||||
output/
|
||||
libcriu.so.*
|
||||
|
|
|
|||
|
|
@ -6,6 +6,7 @@ TESTS += test_notify
|
|||
TESTS += test_iters
|
||||
TESTS += test_errno
|
||||
TESTS += test_join_ns
|
||||
TESTS += test_pre_dump
|
||||
|
||||
all: $(TESTS)
|
||||
.PHONY: all
|
||||
|
|
|
|||
|
|
@ -1,3 +1,5 @@
|
|||
void what_err_ret_mean(int ret);
|
||||
int chk_exit(int status, int want);
|
||||
int get_version(void);
|
||||
|
||||
#define SUCC_ECODE 42
|
||||
|
|
|
|||
|
|
@ -58,6 +58,7 @@ run_test test_notify
|
|||
if [ "$(uname -m)" = "x86_64" ]; then
|
||||
# Skip this on aarch64 as aarch64 has no dirty page tracking
|
||||
run_test test_iters
|
||||
run_test test_pre_dump
|
||||
fi
|
||||
run_test test_errno
|
||||
run_test test_join_ns
|
||||
|
|
|
|||
|
|
@ -46,8 +46,6 @@ static int next_iter(criu_predump_info pi)
|
|||
return cur_iter < MAX_ITERS;
|
||||
}
|
||||
|
||||
#define SUCC_ECODE 42
|
||||
|
||||
int main(int argc, char **argv)
|
||||
{
|
||||
int pid, ret, p[2];
|
||||
|
|
|
|||
|
|
@ -10,8 +10,6 @@
|
|||
|
||||
#include "lib.h"
|
||||
|
||||
#define SUCC_ECODE 42
|
||||
|
||||
static int actions_called = 0;
|
||||
static int notify(char *action, criu_notify_arg_t na)
|
||||
{
|
||||
|
|
|
|||
151
test/others/libcriu/test_pre_dump.c
Normal file
151
test/others/libcriu/test_pre_dump.c
Normal file
|
|
@ -0,0 +1,151 @@
|
|||
#include "criu.h"
|
||||
#include <fcntl.h>
|
||||
#include <stdio.h>
|
||||
#include <errno.h>
|
||||
#include <stdlib.h>
|
||||
#include <signal.h>
|
||||
#include <fcntl.h>
|
||||
#include <sys/stat.h>
|
||||
#include <sys/wait.h>
|
||||
#include <unistd.h>
|
||||
#include "lib.h"
|
||||
|
||||
static int wdir_fd, cur_imgdir = -1;
|
||||
|
||||
static int stop = 0;
|
||||
static void sh(int sig)
|
||||
{
|
||||
stop = 1;
|
||||
}
|
||||
|
||||
static void open_imgdir(void)
|
||||
{
|
||||
char p[10];
|
||||
static int id = 0;
|
||||
|
||||
if (id > 0) {
|
||||
sprintf(p, "../dir-%d", id);
|
||||
criu_set_parent_images(p);
|
||||
}
|
||||
if (cur_imgdir != -1)
|
||||
close(cur_imgdir);
|
||||
sprintf(p, "dir-%d", ++id);
|
||||
mkdirat(wdir_fd, p, 0700);
|
||||
cur_imgdir = openat(wdir_fd, p, O_DIRECTORY);
|
||||
criu_set_images_dir_fd(cur_imgdir);
|
||||
}
|
||||
|
||||
int main(int argc, char **argv)
|
||||
{
|
||||
int pid, ret, p[2];
|
||||
|
||||
wdir_fd = open(argv[2], O_DIRECTORY);
|
||||
if (wdir_fd < 0) {
|
||||
perror("Can't open wdir");
|
||||
return 1;
|
||||
}
|
||||
|
||||
printf("--- Start loop ---\n");
|
||||
pipe(p);
|
||||
pid = fork();
|
||||
if (pid < 0) {
|
||||
perror("Can't");
|
||||
return -1;
|
||||
}
|
||||
|
||||
if (!pid) {
|
||||
printf(" `- loop: initializing\n");
|
||||
if (setsid() < 0)
|
||||
exit(1);
|
||||
if (signal(SIGUSR1, sh) == SIG_ERR)
|
||||
exit(1);
|
||||
|
||||
close(0);
|
||||
close(1);
|
||||
close(2);
|
||||
close(p[0]);
|
||||
|
||||
ret = SUCC_ECODE;
|
||||
write(p[1], &ret, sizeof(ret));
|
||||
close(p[1]);
|
||||
|
||||
while (!stop)
|
||||
sleep(1);
|
||||
exit(SUCC_ECODE);
|
||||
}
|
||||
|
||||
close(p[1]);
|
||||
|
||||
/* Wait for kid to start */
|
||||
ret = -1;
|
||||
read(p[0], &ret, sizeof(ret));
|
||||
if (ret != SUCC_ECODE) {
|
||||
printf("Error starting loop\n");
|
||||
goto err;
|
||||
}
|
||||
|
||||
/* Wait for pipe to get closed, then dump */
|
||||
read(p[0], &ret, 1);
|
||||
close(p[0]);
|
||||
|
||||
printf("--- Dump loop ---\n");
|
||||
criu_init_opts();
|
||||
criu_set_service_binary(argv[1]);
|
||||
criu_set_pid(pid);
|
||||
criu_set_log_file("dump.log");
|
||||
criu_set_log_level(CRIU_LOG_DEBUG);
|
||||
criu_set_track_mem(true);
|
||||
|
||||
open_imgdir();
|
||||
ret = criu_pre_dump();
|
||||
if (ret < 0) {
|
||||
what_err_ret_mean(ret);
|
||||
kill(pid, SIGKILL);
|
||||
goto err;
|
||||
}
|
||||
|
||||
printf(" `- Pre Dump 1 succeeded\n");
|
||||
|
||||
open_imgdir();
|
||||
ret = criu_pre_dump();
|
||||
if (ret < 0) {
|
||||
what_err_ret_mean(ret);
|
||||
kill(pid, SIGKILL);
|
||||
goto err;
|
||||
}
|
||||
|
||||
printf(" `- Pre Dump 2 succeeded\n");
|
||||
|
||||
open_imgdir();
|
||||
ret = criu_dump();
|
||||
if (ret < 0) {
|
||||
what_err_ret_mean(ret);
|
||||
kill(pid, SIGKILL);
|
||||
goto err;
|
||||
}
|
||||
|
||||
printf(" `- Final Dump succeeded\n");
|
||||
waitpid(pid, NULL, 0);
|
||||
|
||||
printf("--- Restore ---\n");
|
||||
criu_init_opts();
|
||||
criu_set_log_level(CRIU_LOG_DEBUG);
|
||||
criu_set_log_file("restore.log");
|
||||
criu_set_images_dir_fd(cur_imgdir);
|
||||
|
||||
pid = criu_restore_child();
|
||||
if (pid <= 0) {
|
||||
what_err_ret_mean(pid);
|
||||
return -1;
|
||||
}
|
||||
|
||||
printf(" `- Restore returned pid %d\n", pid);
|
||||
kill(pid, SIGUSR1);
|
||||
err:
|
||||
if (waitpid(pid, &ret, 0) < 0) {
|
||||
perror(" Can't wait kid");
|
||||
return -1;
|
||||
}
|
||||
|
||||
return chk_exit(ret, SUCC_ECODE);
|
||||
}
|
||||
|
|
@ -15,8 +15,6 @@ static void sh(int sig)
|
|||
stop = 1;
|
||||
}
|
||||
|
||||
#define SUCC_ECODE 42
|
||||
|
||||
int main(int argc, char **argv)
|
||||
{
|
||||
int pid, ret, fd, p[2];
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue