Commit 0023e2e5 authored by Andrew Vagin's avatar Andrew Vagin Committed by Pavel Emelyanov

zdtm: check that a command completes successfully after a fault (v5)

I suggest to inject a fault and than try to execute the same command
again without a fault to check that it will complete successfully.

v2: skip a parasite blob when we are checking vma-s
v3: remove a loop for two iterations
v4: clean up
v5: call fault hooks from one place
Signed-off-by: 's avatarAndrew Vagin <avagin@virtuozzo.com>
Signed-off-by: 's avatarPavel Emelyanov <xemul@virtuozzo.com>
parent fd972a73
...@@ -656,10 +656,26 @@ class criu_cli: ...@@ -656,10 +656,26 @@ class criu_cli:
preexec = self.__user and self.set_user_id or None preexec = self.__user and self.set_user_id or None
__ddir = self.__ddir()
ret = self.__criu(action, s_args, self.__fault, strace, preexec) ret = self.__criu(action, s_args, self.__fault, strace, preexec)
grep_errors(os.path.join(self.__ddir(), log)) grep_errors(os.path.join(__ddir, log))
if ret != 0: if ret != 0:
if self.__fault or self.__test.blocking() or (self.__sat and action == 'restore'): if self.__fault:
try_run_hook(self.__test, ["--fault", action])
if action == "dump":
# create a clean directory for images
os.rename(__ddir, __ddir + ".fail")
os.mkdir(__ddir)
os.chmod(__ddir, 0777)
else:
# on restore we move only a log file, because we need images
os.rename(os.path.join(__ddir, log), os.path.join(__ddir, log + ".fail"))
# try again without faults
ret = self.__criu(action, s_args, False, strace, preexec)
if ret == 0:
return
if self.__test.blocking() or (self.__sat and action == 'restore'):
raise test_fail_expected_exc(action) raise test_fail_expected_exc(action)
else: else:
raise test_fail_exc("CRIU %s" % action) raise test_fail_exc("CRIU %s" % action)
...@@ -819,7 +835,7 @@ def get_visible_state(test): ...@@ -819,7 +835,7 @@ def get_visible_state(test):
mounts[pid] = set(cmounts) mounts[pid] = set(cmounts)
return files, maps, mounts return files, maps, mounts
def check_visible_state(test, state): def check_visible_state(test, state, opts):
new = get_visible_state(test) new = get_visible_state(test)
for pid in state[0].keys(): for pid in state[0].keys():
...@@ -835,7 +851,7 @@ def check_visible_state(test, state): ...@@ -835,7 +851,7 @@ def check_visible_state(test, state):
if old_maps != new_maps: if old_maps != new_maps:
print "%s: Old maps lost: %s" % (pid, old_maps - new_maps) print "%s: Old maps lost: %s" % (pid, old_maps - new_maps)
print "%s: New maps appeared: %s" % (pid, new_maps - old_maps) print "%s: New maps appeared: %s" % (pid, new_maps - old_maps)
if not opts['fault']: # skip parasite blob
raise test_fail_exc("maps compare") raise test_fail_exc("maps compare")
old_mounts = state[2][pid] old_mounts = state[2][pid]
...@@ -935,9 +951,8 @@ def do_run_test(tname, tdesc, flavs, opts): ...@@ -935,9 +951,8 @@ def do_run_test(tname, tdesc, flavs, opts):
except test_fail_expected_exc as e: except test_fail_expected_exc as e:
if e.cr_action == "dump": if e.cr_action == "dump":
t.stop() t.stop()
try_run_hook(t, ["--fault", e.cr_action])
else: else:
check_visible_state(t, s) check_visible_state(t, s, opts)
t.stop() t.stop()
try_run_hook(t, ["--clean"]) try_run_hook(t, ["--clean"])
except test_fail_exc as e: except test_fail_exc as e:
......
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