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:
parent
e42902f641
commit
ada7458306
8 changed files with 91 additions and 34 deletions
|
@ -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):
|
||||||
|
|
|
@ -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):
|
||||||
|
|
|
@ -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
|
||||||
|
|
||||||
|
|
|
@ -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):
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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
|
||||||
|
|
22
pythonrewrite/bin/do_unittests.sh
Executable file
22
pythonrewrite/bin/do_unittests.sh
Executable 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
|
||||||
|
|
|
@ -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__":
|
||||||
|
|
Loading…
Reference in a new issue