diff options
Diffstat (limited to 'src/integration-tests/gnunet_testing.py.in')
-rw-r--r-- | src/integration-tests/gnunet_testing.py.in | 232 |
1 files changed, 232 insertions, 0 deletions
diff --git a/src/integration-tests/gnunet_testing.py.in b/src/integration-tests/gnunet_testing.py.in new file mode 100644 index 0000000..79cbfe9 --- /dev/null +++ b/src/integration-tests/gnunet_testing.py.in @@ -0,0 +1,232 @@ +#!/usr/bin/python +# This file is part of GNUnet. +# (C) 2010 Christian Grothoff (and other contributing authors) +# +# GNUnet is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published +# by the Free Software Foundation; either version 2, or (at your +# option) any later version. +# +# GNUnet is distributed in the hope that it will be useful, but +# WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with GNUnet; see the file COPYING. If not, write to the +# Free Software Foundation, Inc., 59 Temple Place - Suite 330, +# Boston, MA 02111-1307, USA. +# +# Functions for integration testing +import os +import subprocess +import sys +import shutil +import time +from gnunet_pyexpect import pexpect + +class Check: + def __init__(self, test): + self.fulfilled = False + self.conditions = list() + self.test = test + def add (self, condition): + self.conditions.append(condition) + def run (self): + fulfilled = True + pos = 0 + neg = 0 + for c in self.conditions: + if (False == c.check ()): + fulfilled = False + neg += 1 + else: + pos += 1 + self.test.p (str(pos) +' out of '+ str (pos+neg) + ' conditions fulfilled') + return fulfilled + def run_blocking (self, timeout, pos_cont, neg_cont): + execs = 0; + res = False + while ((False == res) and (execs < timeout)): + res = self.run() + time.sleep(1) + execs += 1 + if (res == False): + neg_cont (self) + else: + pos_cont (self) + def evaluate (self, failed_only): + pos = 0 + neg = 0 + for c in self.conditions: + if (False == c.evaluate (failed_only)): + neg += 1 + else: + pos += 1 + print (str(pos) +' out of '+ str (pos+neg) + ' conditions fulfilled') + return self.fulfilled + +class Condition: + def __init__(self): + self.fulfilled = False + self.type = 'generic' + def __init__(self, type): + self.fulfilled = False + self.type = type + def check(self): + return False; + def evaluate (self, failed_only): + if ((self.fulfilled == False) and (failed_only == True)): + print str(self.type) + 'condition for was ' + str(self.fulfilled) + elif (failed_only == False): + print str(self.type) + 'condition for was ' + str(self.fulfilled) + return self.fulfilled + +class FileExistCondition (Condition): + def __init__(self, file): + self.fulfilled = False + self.type = 'file' + self.file = file + def check(self): + if (self.fulfilled == False): + res = os.path.isfile(self.file) + if (res == True): + self.fulfilled = True + return True + else: + return False + else: + return True + def evaluate (self, failed_only): + if ((self.fulfilled == False) and (failed_only == True)): + print str(self.type) + 'condition for file '+self.file+' was ' + str(self.fulfilled) + elif (failed_only == False): + print str(self.type) + 'condition for file '+self.file+' was ' + str(self.fulfilled) + return self.fulfilled + +class StatisticsCondition (Condition): + def __init__(self, peer, subsystem, name, value): + self.fulfilled = False + self.type = 'statistics' + self.peer = peer; + self.subsystem = subsystem; + self.name = name; + self.value = value; + self.result = -1; + def check(self): + if (self.fulfilled == False): + self.result = self.peer.get_statistics_value (self.subsystem, self.name); + if (str(self.result) == str(self.value)): + self.fulfilled = True + return True + else: + return False + else: + return True + def evaluate (self, failed_only): + if (self.result == -1): + res = 'NaN' + else: + res = str(self.result) + if (self.fulfilled == False): + fail = " FAIL!" + op = " != " + else: + fail = "" + op = " == " + if ((self.fulfilled == False) and (failed_only == True)): + print self.peer.id[:4] + " " +self.peer.cfg + " " + str(self.type) + ' condition in subsystem "' + self.subsystem.ljust(12) +'" : "' + self.name.ljust(30) +'" : (expected/real value) ' + str(self.value) + op + res + fail + elif (failed_only == False): + print self.peer.id[:4] + " " +self.peer.cfg + " " + str(self.type) + ' condition in subsystem "' + self.subsystem.ljust(12) +'" : "' + self.name.ljust(30) +'" : (expected/real value) ' + str(self.value) + op + res + fail + return self.fulfilled + +class Test: + def __init__(self, testname, verbose): + self.peers = list() + self.verbose = verbose; + self.name = testname; + srcdir = "../.." + gnunet_pyexpect_dir = os.path.join (srcdir, "contrib") + if gnunet_pyexpect_dir not in sys.path: + sys.path.append (gnunet_pyexpect_dir) + self.gnunetarm = '' + self.gnunetstatistics = '' + if os.name == 'posix': + self.gnunetarm = 'gnunet-arm' + self.gnunetstatistics = 'gnunet-statistics' + self.gnunetpeerinfo = 'gnunet-peerinfo' + elif os.name == 'nt': + self.gnunetarm = 'gnunet-arm.exe' + self.gnunetstatistics = 'gnunet-statistics.exe' + self.gnunetpeerinfo = 'gnunet-peerinfo.exe' + if os.name == "nt": + shutil.rmtree (os.path.join (os.getenv ("TEMP"), testname), True) + else: + shutil.rmtree ("/tmp/" + testname, True) + def add_peer (self, peer): + self.peers.append(peer) + def p (self, msg): + if (self.verbose == True): + print msg + +class Peer: + def __init__(self, test, cfg_file): + if (False == os.path.isfile(cfg_file)): + print ("Peer cfg " + cfg_file + ": FILE NOT FOUND") + self.id = "<NaN>" + self.test = test + self.started = False + self.cfg = cfg_file + def __del__(self): + if (self.started == True): + print 'ERROR! Peer using cfg ' + self.cfg + ' was not stopped' + ret = self.stop () + if (False == ret): + print 'ERROR! Peer using cfg ' + self.cfg + ' could not be stopped' + self.started = False + return ret + else: + return False + def start (self): + self.test.p ("Starting peer using cfg " + self.cfg) + try: + server = subprocess.Popen ([self.test.gnunetarm, '-sq', '-c', self.cfg]) + server.communicate () + except OSError: + print "Can not start peer" + self.started = False + return False + self.started = True; + test = '' + try: + server = pexpect () + server.spawn (None, [self.test.gnunetpeerinfo, '-c', self.cfg ,'-s'], stdout=subprocess.PIPE, stderr=subprocess.STDOUT) + test = server.read("stdout", 1024) + except OSError: + print "Can not get peer identity" + test = (test.split('`')[1]) + self.id = test.split('\'')[0] + return True + def stop (self): + if (self.started == False): + return False + self.test.p ("Stopping peer using cfg " + self.cfg) + try: + server = subprocess.Popen ([self.test.gnunetarm, '-eq', '-c', self.cfg]) + server.communicate () + except OSError: + print "Can not stop peer" + return False + self.started = False + return True; + def get_statistics_value (self, subsystem, name): + server = pexpect () + server.spawn (None, [self.test.gnunetstatistics, '-c', self.cfg ,'-q','-n', name, '-s', subsystem ], stdout=subprocess.PIPE, stderr=subprocess.STDOUT) + #server.expect ("stdout", re.compile (r"")) + test = server.read("stdout", 10240) + tests = test.partition('\n')[0] + if (tests.isdigit() == True): + return tests + else: + return -1 +
\ No newline at end of file |