[CRIU] [PATCH 9/9] test:libcriu: add cr_errno test
Ruslan Kuprieiev
kupruser at gmail.com
Wed Dec 3 11:13:08 PST 2014
Signed-off-by: Ruslan Kuprieiev <kupruser at gmail.com>
---
test/libcriu/Makefile | 1 +
test/libcriu/run.sh | 1 +
test/libcriu/test_errno.c | 152 ++++++++++++++++++++++++++++++++++++++++++++++
3 files changed, 154 insertions(+)
create mode 100644 test/libcriu/test_errno.c
diff --git a/test/libcriu/Makefile b/test/libcriu/Makefile
index e6d0eb0..1a251ba 100644
--- a/test/libcriu/Makefile
+++ b/test/libcriu/Makefile
@@ -2,6 +2,7 @@ TESTS += test_sub
TESTS += test_self
TESTS += test_notify
TESTS += test_iters
+TESTS += test_errno
all: $(TESTS)
diff --git a/test/libcriu/run.sh b/test/libcriu/run.sh
index 4b97eef..e1a9123 100755
--- a/test/libcriu/run.sh
+++ b/test/libcriu/run.sh
@@ -39,6 +39,7 @@ run_test test_sub
run_test test_self
run_test test_notify
run_test test_iters
+run_test test_errno
echo "== Stopping service"
kill -TERM $(cat wdir/s/pidfile)
diff --git a/test/libcriu/test_errno.c b/test/libcriu/test_errno.c
new file mode 100644
index 0000000..c1a33b1
--- /dev/null
+++ b/test/libcriu/test_errno.c
@@ -0,0 +1,152 @@
+#include "criu.h"
+
+#include <sys/types.h>
+#include <sys/stat.h>
+#include <fcntl.h>
+#include <errno.h>
+#include <stdio.h>
+
+#define PID_MAX "/proc/sys/kernel/pid_max"
+
+static int dir_fd;
+static char *service;
+
+static int init(char *argv[])
+{
+ service = argv[1];
+
+ dir_fd = open(argv[2], O_DIRECTORY);
+ if (dir_fd < 0) {
+ perror("Can't open images dir");
+ return -1;
+ }
+
+ return 0;
+}
+
+static void get_base_req(void)
+{
+ criu_init_opts();
+ criu_set_service_address(service);
+ criu_set_images_dir_fd(dir_fd);
+ criu_set_log_level(4);
+}
+
+static int check_resp(int ret, int expected_ret, int err, int expected_err)
+{
+ if (ret != expected_ret) {
+ fprintf(stderr, "Unexpected ret %d (%d expected)\n", ret, expected_ret);
+ return -1;
+ }
+
+ if (err != expected_err) {
+ fprintf(stderr, "Unexpected errno %d (%d expected)\n", err, expected_err);
+ return -1;
+ }
+
+ return 0;
+}
+
+static int no_process(void)
+{
+ FILE *f = NULL;
+ size_t len;
+ ssize_t count;
+ char *buf = NULL;
+ int pid, fd, ret;
+
+ printf("--- Try to dump unexisting process\n");
+
+ f = fopen(PID_MAX, "r");
+ if (!f) {
+ perror("Can't open " PID_MAX);
+ goto err;
+ }
+
+ count = getline(&buf, &len, f);
+ if (count == -1) {
+ perror("Can't read " PID_MAX);
+ goto err;
+ }
+ pid = atoi(buf);
+
+ if (!kill(pid, 0)) {
+ fprintf(stderr, "max pid is taken\n");
+ goto err;
+ }
+
+ get_base_req();
+ criu_set_pid(pid);
+ ret = criu_dump();
+ if (check_resp(ret, -EBADE, errno, ESRCH))
+ goto err;
+
+ printf(" `- Success\n");
+ return 0;
+err:
+ if (f)
+ fclose(f);
+ return -1;
+
+}
+
+static int process_exists(void)
+{
+ int ret;
+
+ printf("--- Try to restore process which pid is already taken by other process\n");
+
+ get_base_req();
+ criu_set_shell_job(true);
+ criu_set_leave_running(true);
+ if (criu_dump()) {
+ fprintf(stderr, "Self-dump failed");
+ goto err;
+ }
+
+ get_base_req();
+ ret = criu_restore();
+ if (check_resp(ret, -EBADE, errno, EEXIST))
+ goto err;
+
+ printf(" `- Success\n");
+ return 0;
+err:
+ return -1;
+}
+
+static int bad_options(void)
+{
+ int ret;
+
+ printf("--- Try to send criu invalid opts\n");
+
+ get_base_req();
+ criu_set_log_file("../file.log");
+ ret = criu_dump();
+ if (check_resp(ret, -EBADE, errno, EBADRQC))
+ goto err;
+
+ printf(" `- Success\n");
+ return 0;
+err:
+ return -1;
+}
+
+int main(int argc, char *argv[])
+{
+ int ret = 1;
+
+ if (init(argv))
+ goto out;
+
+ if (no_process() || process_exists() || bad_options())
+ goto out;
+
+ ret = 0;
+out:
+ if (dir_fd)
+ close(dir_fd);
+
+ return ret;
+}
--
1.9.3
More information about the CRIU
mailing list