moved unittests for (formerly) internal pages to the appropriate plugins

added "do_unittests.sh" - this script should be used to run all unittests before commit
fixed nasty "cannot-switch-languages"-bug
fixed language data loading for plugins
This commit is contained in:
lars 2006-11-02 13:55:31 +00:00
parent e42902f641
commit ada7458306
8 changed files with 91 additions and 34 deletions

View File

@ -85,6 +85,7 @@ class CryptoBoxContainer:
def getCapacity(self): def getCapacity(self):
"""return the current capacity state of the volume """return the current capacity state of the volume
the volume may not be mounted
the result is a tuple of values in megabyte: the result is a tuple of values in megabyte:
(size, available, used) (size, available, used)
""" """
@ -93,6 +94,16 @@ class CryptoBoxContainer:
int(info.f_bsize*info.f_blocks/1024/1024), int(info.f_bsize*info.f_blocks/1024/1024),
int(info.f_bsize*info.f_bavail/1024/1024), int(info.f_bsize*info.f_bavail/1024/1024),
int(info.f_bsize*(info.f_blocks-info.f_bavail)/1024/1024)) int(info.f_bsize*(info.f_blocks-info.f_bavail)/1024/1024))
def getSize(self):
"""return the size of the block device (_not_ of the filesystem)
the result is a value in megabyte
an error is indicated by "-1"
"""
import CryptoBoxTools
return CryptoBoxTools.getBlockDeviceSize(self.device)
def resetObject(self): def resetObject(self):

View File

@ -88,13 +88,17 @@ class CryptoBoxPlugin:
## maybe we have to load a translation afterwards ## maybe we have to load a translation afterwards
if lang != "en": if lang != "en":
langFiles.append(os.path.join(langdir, lang + ".hdf")) langFiles.append(os.path.join(langdir, lang + ".hdf"))
file_found = False
lang_hdf = neo_util.HDF()
for langFile in langFiles: for langFile in langFiles:
if os.access(langFile, os.R_OK): if os.access(langFile, os.R_OK):
lang_hdf = neo_util.HDF()
lang_hdf.readFile(langFile) lang_hdf.readFile(langFile)
return lang_hdf file_found = True
self.cbox.log.debug("Couldn't find a valid plugin language file (%s)" % str(langFiles)) if file_found:
return None return lang_hdf
else:
self.cbox.log.debug("Couldn't find a valid plugin language file (%s)" % str(langFiles))
return None
def loadDataSet(self, hdf): def loadDataSet(self, hdf):

View File

@ -157,3 +157,30 @@ def isPartOfBlockDevice(parent, subdevice):
pass pass
return False return False
def getBlockDeviceSize(device):
if not device: return -1
try:
rdev = os.stat(device).st_rdev
except OSError:
return -1
minor = os.minor(rdev)
major = os.major(rdev)
for f in file("/proc/partitions"):
try:
elements = f.split()
if len(elements) != 4: continue
if (int(elements[0]) == major) and (int(elements[1]) == minor):
return int(elements[2])/1024
except ValueError:
pass
return -1
def getBlockDeviceSizeHumanly(device):
size = getBlockDeviceSize(device)
if size > 5120:
return "%sGB" % size/1024
else:
return "%sMB" % size

View File

@ -1,5 +1,6 @@
import os import os
import CryptoBoxContainer import CryptoBoxContainer
import CryptoBoxTools
## useful constant for some functions ## useful constant for some functions
CONT_TYPES = CryptoBoxContainer.CryptoBoxContainer.Types CONT_TYPES = CryptoBoxContainer.CryptoBoxContainer.Types
@ -33,6 +34,7 @@ class WebInterfaceDataset(dict):
self["Data.CurrentDisk.encryption"] = isEncrypted self["Data.CurrentDisk.encryption"] = isEncrypted
self["Data.CurrentDisk.plaintext"] = isPlain self["Data.CurrentDisk.plaintext"] = isPlain
self["Data.CurrentDisk.active"] = isMounted self["Data.CurrentDisk.active"] = isMounted
self["Data.CurrentDisk.size"] = CryptoBoxTools.getBlockDeviceSizeHumanly(container.getDevice())
if isMounted: if isMounted:
(size, avail, used) = container.getCapacity() (size, avail, used) = container.getCapacity()
percent = used / size percent = used / size
@ -56,6 +58,7 @@ class WebInterfaceDataset(dict):
self["Data.Disks.%d.encryption" % avail_counter] = isEncrypted self["Data.Disks.%d.encryption" % avail_counter] = isEncrypted
self["Data.Disks.%d.plaintext" % avail_counter] = isPlain self["Data.Disks.%d.plaintext" % avail_counter] = isPlain
self["Data.Disks.%d.active" % avail_counter] = isMounted self["Data.Disks.%d.active" % avail_counter] = isMounted
self["Data.Disks.%d.size" % avail_counter] = CryptoBoxTools.getBlockDeviceSizeHumanly(container.getDevice())
if isMounted: active_counter += 1 if isMounted: active_counter += 1
avail_counter += 1 avail_counter += 1
self["Data.activeDisksCount"] = active_counter self["Data.activeDisksCount"] = active_counter
@ -75,7 +78,6 @@ class WebInterfaceDataset(dict):
self["Data.Version"] = self.cbox.VERSION self["Data.Version"] = self.cbox.VERSION
for lang in self.cbox.getAvailableLanguages(): for lang in self.cbox.getAvailableLanguages():
self["Data.Languages." + lang] = self.__getLanguageName(lang) self["Data.Languages." + lang] = self.__getLanguageName(lang)
## TODO: open issues: Data.Config.AdminPasswordIsSet
def __getLanguageName(self, lang): def __getLanguageName(self, lang):

View File

@ -12,6 +12,7 @@ class WebInterfacePlugins:
def __init__(self, log, plugins, handler_func): def __init__(self, log, plugins, handler_func):
for plugin in plugins.getPlugins(): for plugin in plugins.getPlugins():
if not plugin: continue if not plugin: continue
if not plugin.isEnabled(): continue
plname = plugin.getName() plname = plugin.getName()
log.info("Plugin '%s' loaded" % plname) log.info("Plugin '%s' loaded" % plname)
## this should be the "easiest" way to expose all plugins as URLs ## this should be the "easiest" way to expose all plugins as URLs
@ -114,18 +115,21 @@ class WebInterfaceSites:
def index(self, weblang=""): def index(self, weblang=""):
self.__resetDataset() self.__resetDataset()
self.__setWebLang(weblang) self.__setWebLang(weblang)
## do not forget the language!
param_dict = {"weblang":weblang}
## render "disks" plugin by default ## render "disks" plugin by default
return self.return_plugin_action(self.pluginList.getPlugin("disks"))() return self.return_plugin_action(self.pluginList.getPlugin("disks"))(**param_dict)
def return_plugin_action(self, plugin): def return_plugin_action(self, plugin):
def handler(self, **args): def handler(self, **args):
self.__resetDataset() self.__resetDataset()
args_orig = dict(args)
try: try:
self.__setWebLang(args["weblang"]) self.__setWebLang(args["weblang"])
del args["weblang"] del args["weblang"]
except KeyError: except KeyError:
pass self.__setWebLang("")
## check the device argument of volume plugins ## check the device argument of volume plugins
if "volume" in plugin.pluginCapabilities: if "volume" in plugin.pluginCapabilities:
try: try:
@ -155,7 +159,9 @@ class WebInterfaceSites:
and "plugin" in nextTemplate.keys() \ and "plugin" in nextTemplate.keys() \
and "values" in nextTemplate.keys() \ and "values" in nextTemplate.keys() \
and self.pluginList.getPlugin(nextTemplate["plugin"]): and self.pluginList.getPlugin(nextTemplate["plugin"]):
valueDict = nextTemplate["values"] valueDict = dict(nextTemplate["values"])
## force the current weblang attribute - otherwise it gets lost
valueDict["weblang"] = self.dataset["Settings.Language"]
new_plugin = self.pluginList.getPlugin(nextTemplate["plugin"]) new_plugin = self.pluginList.getPlugin(nextTemplate["plugin"])
return self.return_plugin_action(new_plugin)(**valueDict) return self.return_plugin_action(new_plugin)(**valueDict)
## save the currently active plugin name ## save the currently active plugin name

View File

@ -73,6 +73,7 @@ Language = de
cryptsetup = /sbin/cryptsetup cryptsetup = /sbin/cryptsetup
mkfs-data = /sbin/mkfs.ext3 mkfs-data = /sbin/mkfs.ext3
blkid = /sbin/blkid blkid = /sbin/blkid
blockdev = /sbin/blockdev
mount = /bin/mount mount = /bin/mount
umount = /bin/umount umount = /bin/umount
super = /usr/bin/super super = /usr/bin/super

View File

@ -0,0 +1,22 @@
#!/bin/sh
#
# run this script _before_ you do a commit and fix errors before uploading
#
# check if /dev/loop1 is available - otherwise some tests will fail!
if /sbin/losetup /dev/loop1 &>/dev/null
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
# do the tests
for a in unittests.*.py
do testoob -v "$a"
done

View File

@ -21,33 +21,17 @@ class WebServer(WebInterfaceTestClass.WebInterfaceTestClass):
class BuiltinPages(WebInterfaceTestClass.WebInterfaceTestClass): class BuiltinPages(WebInterfaceTestClass.WebInterfaceTestClass):
def test_help_pages(self):
'''help pages should be available in different languages'''
## check english help pages
self.cmd.go(self.URL + "doc?weblang=en")
self.cmd.find("Table of Contents")
self.cmd.find("Getting started")
self.cmd.go(self.URL + "doc?weblang=de")
self.cmd.find("Table of Contents")
self.cmd.find("Wie geht es los")
self.cmd.go(self.URL + "doc?weblang=si")
self.assertRaises(TwillAssertionError, self.cmd.notfind, "Table of Contents")
#TODO: add a slovene text here, as soon as the help is translated
def test_goto_status(self):
'''display all active devices'''
self.cmd.go(self.URL + "status")
self.cmd.find("Status")
def test_goto_system(self):
self.cmd.go(self.URL + "system")
self.cmd.find("System")
def test_goto_index(self):
'''display all devices'''
self.cmd.go(self.URL + "?weblang=en")
self.cmd.find("The CryptoBox")
self.cmd.go(self.URL + "?weblang=de")
self.cmd.find("Die CryptoBox")
self.cmd.go(self.URL + "?weblang=si")
self.cmd.find("Privatnost v vsako vas")
self.cmd.go(self.URL + "?weblang=fr")
self.cmd.find("La CryptoBox")
if __name__ == "__main__": if __name__ == "__main__":