#!/usr/bin/env bats load helpers function setup() { setup_busybox } function teardown() { teardown_bundle } @test "runc create [second createRuntime hook fails]" { update_config '.hooks |= {"createRuntime": [{"path": "/bin/true"}, {"path": "/bin/false"}]}' runc create --console-socket "$CONSOLE_SOCKET" test_hooks [ "$status" -ne 0 ] [[ "$output" == *"error running createRuntime hook #1:"* ]] } @test "runc create [hook fails]" { for hook in prestart createRuntime createContainer; do echo "testing hook $hook" update_config '.hooks |= {"'$hook'": [{"path": "/bin/true"}, {"path": "/bin/false"}]}' runc create --console-socket "$CONSOLE_SOCKET" test_hooks [ "$status" -ne 0 ] [[ "$output" == *"error running $hook hook #1:"* ]] done } @test "runc run [hook fails]" { update_config '.process.args = ["/bin/echo", "Hello World"]' # All hooks except Poststop. for hook in prestart createRuntime createContainer startContainer poststart; do echo "testing hook $hook" update_config '.hooks |= {"'$hook'": [{"path": "/bin/true"}, {"path": "/bin/false"}]}' runc run "test_hook-$hook" # Failed poststart hooks results in container being killed, # but only after it has started, so output may or may not appear. if [ "$hook" != "poststart" ]; then [[ "$output" != "Hello World" ]] fi [ "$status" -ne 0 ] [[ "$output" == *"error running $hook hook #1:"* ]] done } # While runtime-spec does not say what environment variables hooks should have, # if not explicitly specified, historically the StartContainer hook inherited # the process environment specified for init. # # Check this behavior is preserved. @test "runc run [startContainer hook should inherit process environment]" { cat >"rootfs/check-env.sh" <<-'EOF' #!/bin/sh -ue test $ONE = two test $FOO = bar echo $HOME # Test HOME is set w/o checking the value. EOF chmod +x "rootfs/check-env.sh" update_config ' .process.args = ["/bin/true"] | .process.env = ["ONE=two", "FOO=bar"] | .hooks |= {"startContainer": [{"path": "/check-env.sh"}]}' runc run ct1 [ "$status" -eq 0 ] } # https://github.com/opencontainers/runc/issues/1663 @test "runc run [hook's argv is preserved]" { # Check that argv[0] and argv[1] passed to the hook's binary # exactly as set in config.json. update_config '.hooks |= {"startContainer": [{"path": "/bin/busybox", "args": ["cat", "/nosuchfile"]}]}' runc run ct1 [ "$status" -ne 0 ] [[ "$output" == *"cat: can't open"*"/nosuchfile"* ]] # Busybox also accepts commands where argv[0] is "busybox", # and argv[1] is applet name. Test this as well. update_config '.hooks |= {"startContainer": [{"path": "/bin/busybox", "args": ["busybox", "cat", "/nosuchfile"]}]}' runc run ct1 [ "$status" -ne 0 ] [[ "$output" == *"cat: can't open"*"/nosuchfile"* ]] }