From 615073e02ce5c1912e65f432b51b8e81bd952f4e Mon Sep 17 00:00:00 2001 From: frisco <> Date: Mon, 11 May 2009 10:02:49 +0000 Subject: [PATCH] Changes to use unit tests in non-User Mode Linux environment; merged cryptobox.conf into cryptobox-unittests.conf --- bin/cryptobox-unittests.conf | 12 +++ bin/cryptobox.conf | 102 -------------------------- bin/do_unittests.sh | 36 ++++++--- bin/run_webserver.sh | 2 +- bin/uml-setup.sh | 5 ++ plugins/partition/unittests.py | 3 + src/cryptobox/tests/base.py | 5 +- src/cryptobox/tests/test.cryptobox.py | 2 +- src/cryptobox/tests/tools.py | 23 +++--- 9 files changed, 61 insertions(+), 129 deletions(-) delete mode 100644 bin/cryptobox.conf diff --git a/bin/cryptobox-unittests.conf b/bin/cryptobox-unittests.conf index 3fcfe77..7b721ab 100644 --- a/bin/cryptobox-unittests.conf +++ b/bin/cryptobox-unittests.conf @@ -84,5 +84,17 @@ umount = /bin/umount nice = /usr/bin/nice super = /usr/bin/super # this is the "program" name as defined in /etc/super.tab +# "CryptoBoxRootActionsLocal" (in /etc/super.tab) should point to the +# CryptoBoxRootActions.py file in your local working directory. This avoids +# conflicts with a locally (apt-)installed CryptoBoxRootActions.py file CryptoBoxRootActions = CryptoBoxRootActionsLocal + +[PluginSettings] +# plugin specific settings +# the section names _must_ be the same as the names of the plugins + +## change the default network interface for the plugin "network" +#[[network]] +#interface = eth0 + diff --git a/bin/cryptobox.conf b/bin/cryptobox.conf deleted file mode 100644 index bc4d4e9..0000000 --- a/bin/cryptobox.conf +++ /dev/null @@ -1,102 +0,0 @@ -[Main] - -# comma separated list of possible prefixes for accesible devices -# beware: .e.g "/dev/hd" grants access to _all_ harddisks -# (floppy disks are not supported, does anyone still use them?) -AllowedDevices = /dev/ram, /dev/ubdb, /dev/md_d127 - -# use separate config partition? (1=yes / 0=no) -UseConfigPartition = 1 - -# the default name prefix of not unnamed containers -DefaultVolumePrefix = "Disk " - -# which cipher should cryptsetup-luks use? -#TODO: uml does not support this module - DefaultCipher = aes-cbc-essiv:sha256 -DefaultCipher = aes-plain - -# label of the configuration partition (you should never change this) -ConfigVolumeLabel = cbox_config - -# which plugins should be disabled? (comma seperated list) -#DisabledPlugins = network, shutdown, partition - - -[Locations] -# where should we mount volumes? -# this directory must be writeable by the cryptobox user (see above) -#MountParentDir = /var/cache/cryptobox/mnt -MountParentDir = ../ttt/mnt - -# settings directory: contains name database and plugin configuration -#SettingsDir = /var/cache/cryptobox/settings -SettingsDir = ../ttt/settings - -# where are the clearsilver templates? -#TemplateDir = /usr/share/cryptobox/templates -TemplateDir = ../templates - -# path to documentation files -#DocDir = /usr/share/doc/cryptobox/www-data -DocDir = ../doc/html - -# plugin directories - you may specify more than one directory (comma seperated) -#PluginDir = /usr/share/cryptobox/plugins -PluginDir = ../plugins - -# path to the hook directory (e.g. containing some scripts) -#HookDir = /etc/cryptobox/hooks.d -EventDir = ../event-scripts - - -[Log] -# possible values are "debug", "info", "warn" and "error" or numbers from -# 0 (debug) to 7 (error) -Level = debug - -# where to write the log messages to? -# possible values are: file -# syslog support will be added later -Destination = file - -# depending on the choosen destination (see above) you may select -# details. Possible values for the different destinations are: -# file: $FILENAME -# syslog: $LOG_FACILITY -#Details = /var/log/cryptobox.log -Details = ./cryptobox.log -#Details = SYSLOG - - -[WebSettings] -# URL of default stylesheet -Stylesheet = cryptobox-misc/cryptobox.css - -# default language -Languages = en, de, sl, fr - - -[Programs] -cryptsetup = /sbin/cryptsetup -mkfs = /sbin/mkfs -blkid = /sbin/blkid -blockdev = /sbin/blockdev -mount = /bin/mount -umount = /bin/umount -nice = /usr/bin/nice -super = /usr/bin/super -# this is the "program" name as defined in /etc/super.tab -# "CryptoBoxRootActionsLocal" (in /etc/super.tab) should point to the -# CryptoBoxRootActions.py file in your local working directory - this avoids -# conflicts with a locally (apt-)installed CryptoBoxRootActions.py file -CryptoBoxRootActions = CryptoBoxRootActionsLocal - - -[PluginSettings] -# plugin specific settings -# the section names _must_ be the same as the names of the plugins - -## change the default network interface for the plugin "network" -#[[network]] -#interface = eth0 - diff --git a/bin/do_unittests.sh b/bin/do_unittests.sh index 6d06c32..e72fdaa 100755 --- a/bin/do_unittests.sh +++ b/bin/do_unittests.sh @@ -1,4 +1,5 @@ #!/bin/sh + # # run this script _before_ you do a commit and fix errors before uploading # @@ -8,6 +9,7 @@ # CryptoBoxRootActionsLocal ./CryptoBoxRootActions cryptobox # +GETOPT="getopt" BASE_DIR=$(cd "$(dirname $0)/.."; pwd) export PYTHONPATH=$BASE_DIR/src @@ -22,17 +24,29 @@ enable_filecheck() sed -i "s/^OVERRIDE_FILECHECK = .*$/OVERRIDE_FILECHECK = False/" "$BASE_DIR/bin/CryptoBoxRootActions" } -# check if /dev/loop1 is available - otherwise some tests will fail! -if /sbin/losetup /dev/loop1 &>/dev/null || test -e /dev/ubdb - then true - else echo "misconfiguration detected: sorry - you need /dev/loop1 for the tests" >&2 - echo "just do the following:" >&2 - echo " dd if=/dev/zero of=test.img bs=1M count=1 seek=100" >&2 - echo " sudo /sbin/losetup /dev/loop1 test.img" >&2 - echo "then you can run the tests again ..." >&2 - echo >&2 - exit 1 - fi +#Using getopt(1) would be the super-thorough way to do this; use the +#quick-and-dirty method instead +# case $1 in +# --clobber=*) +# TEST_DISK=`echo $1 | sed 's/[-a-zA-Z0-9]*=//'` +# ;; +# *) +# ;; +# +#esac +#parse out the remaining command line arguments + +## now check that TEST_DISK is not empty and is a block device (more flexibility could possibly be added) + +####################################################################3 +##Attention!!! Don't check this in with the following variable set! +## +## the "/dev/" prefix is already assumed by the test classes +#CNAS_UTEST_CLOBBER="sdb" +CNAS_UTEST_CLOBBER="" + +export CNAS_UTEST_CLOBBER + dest_files="" while test $# -gt 0 diff --git a/bin/run_webserver.sh b/bin/run_webserver.sh index c6fdd81..9342552 100755 --- a/bin/run_webserver.sh +++ b/bin/run_webserver.sh @@ -33,7 +33,7 @@ export PYTHONPATH="$BIN_DIR/../src" #export HTTPS=1 PREFERRED_CONF_FILE=$BIN_DIR/cryptobox-local.conf -FALLBACK_CONF_FILE=$BIN_DIR/cryptobox.conf +FALLBACK_CONF_FILE=$BIN_DIR/cryptobox-unittests.conf ## determine the configuration file CONFIG_FILE=$FALLBACK_CONF_FILE diff --git a/bin/uml-setup.sh b/bin/uml-setup.sh index e73bbca..2ba5457 100755 --- a/bin/uml-setup.sh +++ b/bin/uml-setup.sh @@ -1,4 +1,9 @@ #!/bin/sh +#uml-setup.sh +# +#This file does some setup required for running the unit tests under +#User Mode Linux (UML). If you are using a different test setup, it +#does not apply. PROJ_DIR=$(dirname "$0")/.. PROJ_DIR=$(cd "$PROJ_DIR"; pwd) diff --git a/plugins/partition/unittests.py b/plugins/partition/unittests.py index 68d5721..08accd3 100644 --- a/plugins/partition/unittests.py +++ b/plugins/partition/unittests.py @@ -30,3 +30,6 @@ class unittests(WebInterfaceTestClass): self.cmd.go(url) self.cmd.find('VERY careful') +#TODO: add tests for case where we're creating a config +# partition followed by two "data" partitions. All the +# partitions need to be created. diff --git a/src/cryptobox/tests/base.py b/src/cryptobox/tests/base.py index 0ebf44f..90fd8d3 100644 --- a/src/cryptobox/tests/base.py +++ b/src/cryptobox/tests/base.py @@ -69,13 +69,14 @@ class CommonTestClass(unittest.TestCase): ## search for a usable block device ## use /dev/ubd? if possible - otherwise /dev/hd? ## so it will be possible to use these tests inside of a uml - self.blockdevice = testtools.find_test_device() + self.DRIVE_TO_CLOBBER = os.environ.get("CNAS_UTEST_CLOBBER") + self.blockdevice = testtools.find_test_device(self.DRIVE_TO_CLOBBER) ## umount the partitions of this device (just to be sure) for num in range(12): testtools.umount("%s%d" % (self.blockdevice, num)) ## format device and partition block device if necessary testtools.prepare_partition(self.blockdevice) - self.blockdevice = testtools.find_test_device() + self.blockdevice = testtools.find_test_device(self.DRIVE_TO_CLOBBER) self.device = self.blockdevice + "1" self.blockdevice_html = self.blockdevice.replace("/", "%2F") ## the assumption is not always valid - but usually it is ok diff --git a/src/cryptobox/tests/test.cryptobox.py b/src/cryptobox/tests/test.cryptobox.py index 0182bbd..07c498b 100755 --- a/src/cryptobox/tests/test.cryptobox.py +++ b/src/cryptobox/tests/test.cryptobox.py @@ -45,7 +45,7 @@ class CryptoBoxDeviceTests(CommonTestClass): '''is_device_allowed should accept permitted devices''' # check if one of the common devices exists and is allowed blockdevice_found = False - for dev_node in COMMON_ALLOWED_DEVICES: + for dev_node in (COMMON_ALLOWED_DEVICES + [ self.blockdevice ]): if os.path.exists(dev_node): self.assertTrue(self.cb.is_device_allowed(dev_node)) blockdevice_found = True diff --git a/src/cryptobox/tests/tools.py b/src/cryptobox/tests/tools.py index b376604..66c2550 100644 --- a/src/cryptobox/tests/tools.py +++ b/src/cryptobox/tests/tools.py @@ -26,27 +26,26 @@ just inherit one of its classes and add some test functions __revision__ = "$Id$" -TEST_DEVICE_LIST = ["ubdb", "loop", "ubda", "udbc", "ubdd", "sd"] import os import subprocess -def find_test_device(): - """Search for a valid test device - the data will get lost ... +def find_test_device(candidate): + """Check for a valid test device - the data will get lost ... the result is the parent blockdevice (containing the partition table) and the single partition """ - for dev in TEST_DEVICE_LIST: - if os.path.exists("/dev/%s" % dev) \ - and os.access("/dev/%s" % dev, os.W_OK): - try: - ## try if it is a symlink - return os.readlink("/dev/%s" % dev) - except OSError: - ## not a symlink (usual) - return "/dev/%s" % dev + dev = candidate + if os.path.exists("/dev/%s" % dev) \ + and os.access("/dev/%s" % dev, os.W_OK): + try: + ## try if it is a symlink + return os.readlink("/dev/%s" % dev) + except OSError: + ## not a symlink (usual) + return "/dev/%s" % dev else: raise Exception, "no valid device for testing found"