[lxc-devel] [lxc/master] lxc-attach: update and improve tests

brauner on Github lxc-bot at linuxcontainers.org
Wed Mar 9 14:46:40 UTC 2016


A non-text attachment was scrubbed...
Name: not available
Type: text/x-mailbox
Size: 364 bytes
Desc: not available
URL: <http://lists.linuxcontainers.org/pipermail/lxc-devel/attachments/20160309/76f223f9/attachment.bin>
-------------- next part --------------
From 6708dc4204145501db168db6ccdd2fc3936fb41c Mon Sep 17 00:00:00 2001
From: Christian Brauner <christian.brauner at mailbox.org>
Date: Wed, 9 Mar 2016 15:44:05 +0100
Subject: [PATCH] lxc-attach: update and improve tests

Signed-off-by: Christian Brauner <christian.brauner at mailbox.org>
---
 src/tests/lxc-test-lxc-attach | 175 ++++++++++++++++++++++++++----------------
 1 file changed, 110 insertions(+), 65 deletions(-)

diff --git a/src/tests/lxc-test-lxc-attach b/src/tests/lxc-test-lxc-attach
index 6a53176..27cc2bd 100755
--- a/src/tests/lxc-test-lxc-attach
+++ b/src/tests/lxc-test-lxc-attach
@@ -6,7 +6,7 @@
 # Christian Brauner <christian.brauner at mailbox.org>
 #
 # This is a test script for the lxc-attach program. It tests whether I/O
-# redirection works correctly.
+# redirection and pty allocation works correctly.
 
 # This library is free software; you can redistribute it and/or
 # modify it under the terms of the GNU Lesser General Public
@@ -24,6 +24,25 @@
 
 set -e
 
+# NOTE:
+# lxc-attach allocates a pty on the host and attaches any standard file
+# descriptors that refer to a pty to it. Standard file descriptors which do not
+# refer to a pty are not attached. In order to determine whether lxc-attach
+# works correctly we test various methods of redirection on the host. E.g.:
+#
+#       lxc-attach -n busy -- hostname < /dev/null
+#
+# This is done to check whether the file descriptor that gets redirected to
+# /dev/null is (a) left alone and (b) that lxc-attach does not fail. When
+# lxc-attach fails we know that it's behavior has been altered, e.g. by trying
+# to attach a standard file descriptor that does not refer to a pty.
+# The small table preceeding each test case show which standard file descriptors
+# we expect to be attached to a pty and which we expect to be redirected. E.g.
+#
+#       stdin  --> attached to pty
+#       stdout --> attached to pty
+#       stderr --> attached to pty
+
 FAIL() {
 	echo -n "Failed " >&2
 	echo "$*" >&2
@@ -31,103 +50,129 @@ FAIL() {
 	exit 1
 }
 
-# Create a container, start it and wait for it to be in running state
-lxc-create -t busybox -n busy || FAIL "creating busybox container"
+# Create a container, start it and wait for it to be in running state.
+lxc-create -t archlinux -n busy || FAIL "creating busybox container"
 lxc-start -n busy -d || FAIL "starting busybox container"
 lxc-wait -n busy -s RUNNING || FAIL "waiting for busybox container to run"
 
-# Test if simple attach is working
-# - stdin  --> attached to pty
-# - stdout --> attached to pty
-# - stderr --> attached to pty
-attach=$(lxc-attach -n busy -- hostname) # expect output
+# stdin  --> attached to pty
+# stdout --> attached to pty
+# stderr --> attached to pty
+attach=$(lxc-attach -n busy -- hostname || FAIL " to allocate or setup pty")
 if [ "$attach" != "busy" ]; then
         FAIL " simple attach"
 fi
 
-# Test if we still receive output when stdin does not refer to a tty
-# - stdin  --> /dev/null
-# - stdout --> attached to pty
-# - stderr --> attached to pty
-attach=$(lxc-attach -n busy -- hostname < /dev/null) # expect output
+# stdin  --> /dev/null
+# stdout --> attached to pty
+# stderr --> attached to pty
+attach=$(lxc-attach -n busy -- hostname < /dev/null || FAIL " to allocate or setup pty")
 if [ "$attach" != "busy" ]; then
-        FAIL " with stdin redirection < /dev/null"
+        FAIL " lxc-attach -n busy -- hostname < /dev/null"
 fi
 
-# Test if we are silent when stdout does not refer to a tty
-# - stdin  --> attached to pty
-# - stdout --> /dev/null
-# - stderr --> attached to pty
-attach=$(lxc-attach -n busy -- hostname > /dev/null) # expect no output
+# stdin  --> attached to pty
+# stdout --> /dev/null
+# stderr --> attached to pty
+attach=$(lxc-attach -n busy -- hostname > /dev/null || FAIL " to allocate or setup pty")
 if [ -n "$attach" ]; then
-        FAIL " with stdout redirection > /dev/null"
+        FAIL " lxc-attach -n busy -- hostname > /dev/null"
 fi
 
-# Test if we are silent when stdout and stdin do not refer to a tty
-# - stdin  --> /dev/null
-# - stdout --> /dev/null
-# - stderr --> attached to pty
-attach=$(lxc-attach -n busy -- hostname > /dev/null < /dev/null) # expect no output
-if [ -n "$attach" ]; then
-        FAIL " with stdin and stdout redirection > /dev/null < /dev/null"
+# stdin  --> attached to pty
+# stdout --> attached to pty
+# stderr --> /dev/null
+attach=$(lxc-attach -n busy -- hostname 2> /dev/null || FAIL " to allocate or setup pty")
+if [ "$attach" != "busy" ]; then
+        FAIL " lxc-attach -n busy -- hostname 2> /dev/null < /dev/null"
 fi
 
-# Test if we still receive output when stdin and stderr do not refer to a tty
-# - stdin  --> /dev/null
-# - stdout --> attached to pty
-# - stderr --> /dev/null
-attach=$(lxc-attach -n busy -- hostname 2> /dev/null < /dev/null) # expect output
+# stdin  --> /dev/null
+# stdout --> attached to pty
+# stderr --> /dev/null
+attach=$(lxc-attach -n busy -- hostname 2> /dev/null < /dev/null || FAIL " to allocate or setup pty")
 if [ "$attach" != "busy" ]; then
-        FAIL " with stdin and stderr redirection 2> /dev/null < /dev/null"
+        FAIL " lxc-attach -n busy -- hostname 2> /dev/null < /dev/null"
 fi
 
-# - produce output on stderr in container
-# - redirect stdout on host to /dev/null
-# - output on host should be received on stderr
-# - to capture the ouput on stderr on the host we redirect stderr on the host to
-#   stdout
-# - stdin  --> attached to pty
-# - stdout --> /dev/null
-# - stderr --> attached to pty
-attach=$( ( lxc-attach -n busy -- sh -c 'hostname >&2' > /dev/null ) 2>&1 )
+# Use a synthetic reproducer in container to produce output on stderr. stdout on
+# the host gets redirect to /dev/null. We should still be able to receive
+# containers output on stderr on the host. (The command is run in a subshell.
+# This allows us to redirect stderr to stdout for the subshell and capture the
+# output in the attach variable.)
+# stdin  --> attached to pty
+# stdout --> /dev/null
+# stderr --> attached to pty
+attach=$( ( lxc-attach -n busy -- sh -c 'hostname >&2' > /dev/null ) 2>&1 || FAIL " to allocate or setup pty")
 if [ "$attach" != "busy" ]; then
-        FAIL " bla sh -c 'hostname >&2' >/dev/null"
+        FAIL " lxc-attach -n busy -- sh -c 'hostname >&2' > /dev/null"
 fi
 
-# - produce output on stderr in container
-# - redirect stderr on host to /dev/null
-# - no output from container should be received on stderr on host
-# - stdin  --> attached to pty
-# - stdout --> attached to pty
-# - stderr --> /dev/null
-attach=$( ( lxc-attach -n busy -- sh -c 'hostname >&2' 2> /dev/null ) 2>&1 )
+# Use a synthetic reproducer in container to produce output on stderr. stderr on
+# the host gets redirect to /dev/null. We should not receive output on stderr on
+# the host. (The command is run in a subshell. This allows us to redirect stderr
+# to stdout for the subshell and capture the output in the attach variable.)
+# stdin  --> attached to pty
+# stdout --> attach to pty
+# stderr --> /dev/null
+attach=$( ( lxc-attach -n busy -- sh -c 'hostname >&2' 2> /dev/null ) 2>&1 || FAIL " to allocate or setup pty")
 if [ -n "$attach" ]; then
-        FAIL " bla sh -c 'hostname >&2' 2> /dev/null"
+        FAIL " lxc-attach -n busy -- sh -c 'hostname >&2' 2> /dev/null"
 fi
 
-# Test file redirection
+
+# stdin  --> attached to pty
+# stdout --> /dev/null
+# stderr --> attached to pty
+# (As we expect the exit code of the command to be 1 we ignore it.)
+attach=$(lxc-attach -n busy -- sh -c 'rm 2>&1' > /dev/null || true)
+if [ -n "$attach" ]; then
+        FAIL " lxc-attach -n busy -- sh -c 'rm 2>&1' > /dev/null"
+fi
+
+
 # - stdin  --> attached to pty
-# - stdout --> /dev/null
+# - stdout --> attached to pty
 # - stderr --> /dev/null
+# (As we expect the exit code of the command to be 1 we ignore it.)
+attach=$(lxc-attach -n busy -- sh -c 'rm 2>&1' 2> /dev/null || true)
+if [ -z "$attach" ]; then
+        FAIL " lxc-attach -n busy -- sh -c 'rm 2>&1' 2> /dev/null"
+fi
+
+# stdin  --> $in
+# stdout --> attached to pty
+# stderr --> attached to pty
+attach=$(echo hostname | lxc-attach -n busy -- || FAIL " to allocate or setup pty")
+if [ "$attach" != "busy" ]; then
+        FAIL " echo hostname | lxc-attach -n busy --"
+fi
+
+# stdin  --> attached to pty
+# stdout --> $out
+# stderr --> $err
 out=$(mktemp /tmp/out_XXXX)
 err=$(mktemp /tmp/err_XXXX)
-lxc-attach -n busy -- sh -c 'echo OUT; echo ERR >&2' > $out 2> $err
+trap "rm -f $out $err" EXIT INT QUIT PIPE
+lxc-attach -n busy -- sh -c 'echo OUT; echo ERR >&2' > $out 2> $err || FAIL " to allocate or setup pty"
 outcontent=$(cat $out)
 errcontent=$(cat $err)
 if [ "$outcontent" != "OUT" ] || [ "$errcontent" != "ERR" ]; then
-        FAIL " bla sh -c 'echo OUT; echo ERR >&2' > $out 2> $err"
+        FAIL " lxc-attach -n busy -- sh -c 'echo OUT; echo ERR >&2' > $out 2> $err"
 fi
 
-# Test stdin input
-# - stdin  --> $in
-# - stdout --> attached to pty
-# - stderr --> attached to pty
-in=$(mktemp /tmp/in_XXXX)
-echo '#!/bin/sh' > $in
-echo hostname >> $in
-attach=$(lxc-attach -n busy -- < $in)
-if [ "$attach" != "busy" ]; then
-        FAIL " < $in"
+# stdin  --> $in
+# stdout --> $out
+# stderr --> $err
+# (As we expect the exit code of the command to be 1 we ignore it.)
+out=$(mktemp /tmp/out_XXXX)
+err=$(mktemp /tmp/err_XXXX)
+trap "rm -f $out $err" EXIT INT QUIT PIPE
+echo "hostname; rm" | lxc-attach -n busy > $out 2> $err || true
+outcontent=$(cat $out)
+errcontent=$(cat $err)
+if [ "$outcontent" != "busy" ] || [ -z "$errcontent" ]; then
+        FAIL " echo 'hostname; rm' | lxc-attach -n busy > $out 2> $err"
 fi
 
 lxc-destroy -n busy -f


More information about the lxc-devel mailing list