From 6a595ff6a8277dc716e268c2f3f389d60b0d5471 Mon Sep 17 00:00:00 2001 From: Matthias Wachs Date: Thu, 16 Feb 2012 16:18:20 +0000 Subject: - changes to integration --- src/integration-tests/gnunet_pyexpect.py.in | 83 ++++++++++++++++++++++ src/integration-tests/gnunet_testing.py.in | 82 +++++++++++---------- .../test_integration_bootstrap_and_connect.py.in | 24 +++---- .../test_integration_clique.py.in | 6 +- .../test_integration_clique_nat.py.in | 6 +- .../test_integration_disconnect.py.in | 4 +- .../test_integration_restart.py.in | 4 +- 7 files changed, 151 insertions(+), 58 deletions(-) create mode 100644 src/integration-tests/gnunet_pyexpect.py.in diff --git a/src/integration-tests/gnunet_pyexpect.py.in b/src/integration-tests/gnunet_pyexpect.py.in new file mode 100644 index 000000000..9e5c83fa3 --- /dev/null +++ b/src/integration-tests/gnunet_pyexpect.py.in @@ -0,0 +1,83 @@ +#!@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. +# +# Testcase for gnunet-peerinfo +from __future__ import print_function +import os +import re +import subprocess +import sys +import shutil +import time + +class pexpect (object): + def __init__ (self): + super (pexpect, self).__init__ () + + def spawn (self, stdin, arglist, *pargs, **kwargs): + env = kwargs.pop ('env', None) + if env is None: + env = os.environ.copy () + # This messes up some testcases, disable log redirection + env.pop ('GNUNET_FORCE_LOGFILE', None) + self.proc = subprocess.Popen (arglist, *pargs, env=env, **kwargs) + if self.proc is None: + print ("Failed to spawn a process {0}".format (arglist)) + sys.exit (1) + if stdin is not None: + self.stdo, self.stde = self.proc.communicate (stdin) + else: + self.stdo, self.stde = self.proc.communicate () + return self.proc + + def expect (self, s, r, flags=0): + stream = self.stdo if s == 'stdout' else self.stde + if isinstance (r, str): + if r == "EOF": + if len (stream) == 0: + return True + else: + print ("Failed to find `{1}' in {0}, which is `{2}' ({3})".format (s, r, stream, len (stream))) + sys.exit (2) + raise ValueError ("Argument `r' should be an instance of re.RegexObject or a special string, but is `{0}'".format (r)) + m = r.search (stream, flags) + if not m: + print ("Failed to find `{1}' in {0}, which is is `{2}'".format (s, r.pattern, stream)) + sys.exit (2) + stream = stream[m.end ():] + if s == 'stdout': + self.stdo = stream + else: + self.stde = stream + return m + + def read (self, s, size=-1): + stream = self.stdo if s == 'stdout' else self.stde + result = "" + if size < 0: + result = stream + new_stream = "" + else: + result = stream[0:size] + new_stream = stream[size:] + if s == 'stdout': + self.stdo = new_stream + else: + self.stde = new_stream + return result diff --git a/src/integration-tests/gnunet_testing.py.in b/src/integration-tests/gnunet_testing.py.in index 9d4a32877..cbafb0e31 100644 --- a/src/integration-tests/gnunet_testing.py.in +++ b/src/integration-tests/gnunet_testing.py.in @@ -1,4 +1,4 @@ -#!@PYTHON@ +#!/usr/bin/python # This file is part of GNUnet. # (C) 2010 Christian Grothoff (and other contributing authors) # @@ -19,12 +19,11 @@ # # Functions for integration testing import os -import re import subprocess import sys import shutil import time - +from gnunet_pyexpect import pexpect class Check: def __init__(self, test): @@ -56,11 +55,11 @@ class Check: neg_cont (self) else: pos_cont (self) - def eval(self, failed_only): + def evaluate (self, failed_only): pos = 0 neg = 0 for c in self.conditions: - if (False == c.eval (failed_only)): + if (False == c.evaluate (failed_only)): neg += 1 else: pos += 1 @@ -76,7 +75,7 @@ class Condition: self.type = type def check(self): return False; - def eval(self, failed_only): + 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): @@ -98,7 +97,7 @@ class FileExistCondition (Condition): return False else: return True - def eval(self, failed_only): + 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): @@ -124,11 +123,11 @@ class StatisticsCondition (Condition): return False else: return True - def eval(self, failed_only): - if (self.result == -1): - res = 'NaN' - else: - res = str(self.result) + def evaluate (self, failed_only): + if (self.result == -1): + res = 'NaN' + else: + res = str(self.result) if (self.fulfilled == False): fail = " FAIL!" op = " != " @@ -144,47 +143,50 @@ class StatisticsCondition (Condition): class Test: def __init__(self, testname, verbose): self.peers = list() - self.verbose = verbose; - self.name = testname; - srcdir = "../.." + 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) - from gnunet_pyexpect import pexpect + sys.path.append (gnunet_pyexpect_dir) self.gnunetarm = '' self.gnunetstatistics = '' if os.name == 'posix': - self.gnunetarm = 'gnunet-arm' - self.gnunetstatistics = 'gnunet-statistics' + 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.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 (peer): - self.conditions.append(condition) + def add_peer (self, peer): + self.peers.append(peer) def p (self, msg): if (self.verbose == True): - print msg + 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 = "" 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' - if (ret == self.stop ()): - print 'ERROR! Peer using cfg ' + self.cfg + ' could not be stopped' - self.started == False - return ret - else: - return False + 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: @@ -194,11 +196,20 @@ class Peer: print "Can not start peer" self.started = False return False - self.started = True + 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 + 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]) @@ -209,7 +220,6 @@ class Peer: self.started = False return True; def get_statistics_value (self, subsystem, name): - from gnunet_pyexpect import pexpect 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"")) diff --git a/src/integration-tests/test_integration_bootstrap_and_connect.py.in b/src/integration-tests/test_integration_bootstrap_and_connect.py.in index 7738c72d8..1492d479d 100755 --- a/src/integration-tests/test_integration_bootstrap_and_connect.py.in +++ b/src/integration-tests/test_integration_bootstrap_and_connect.py.in @@ -1,4 +1,4 @@ -#!@PYTHON@ +#!/usr/bin/python # This file is part of GNUnet. # (C) 2010 Christian Grothoff (and other contributing authors) # @@ -68,7 +68,7 @@ def success_cont (check): def fail_cont (check): global success success = False; - check.eval(True) + check.evaluate(True) def check (): check = Check (test) @@ -103,13 +103,13 @@ def run (): server = Peer(test, './confs/c_bootstrap_server.conf'); client = Peer(test, './confs/c_no_nat_client.conf'); - server.start(); - client.start(); + assert (True == server.start()); + assert (True == client.start()); if ((client.started == True) and (server.started == True)): - test.p ('Peers started, running check') - time.sleep(5) - check () + test.p ('Peers started, running check') + time.sleep(5) + check () server.stop () client.stop () @@ -122,12 +122,12 @@ def run (): return True try: - run () + run () except (KeyboardInterrupt, SystemExit): - print 'Test interrupted' - server.stop () - client.stop () - cleanup () + print 'Test interrupted' + server.stop () + client.stop () + cleanup () if (success == False): sys.exit(1) else: diff --git a/src/integration-tests/test_integration_clique.py.in b/src/integration-tests/test_integration_clique.py.in index 5cd8d9bb5..49a2c592c 100755 --- a/src/integration-tests/test_integration_clique.py.in +++ b/src/integration-tests/test_integration_clique.py.in @@ -63,7 +63,7 @@ def success_cont (check): def fail_cont (check): global success success= False; - check.eval(True) + check.evaluate(True) def check_disconnect_client (): @@ -87,7 +87,7 @@ def success_disconnect_server_cont (check): def fail_disconnect_server_cont (check): global success success= False; - check.eval(True) + check.evaluate(True) def check_disconnect_server (): @@ -116,7 +116,7 @@ def success_connect_cont (check): def fail_connect_cont (check): global success success= False; - check.eval(True) + check.evaluate(True) def check_connect (): diff --git a/src/integration-tests/test_integration_clique_nat.py.in b/src/integration-tests/test_integration_clique_nat.py.in index 0ea0a78cf..e8f771950 100755 --- a/src/integration-tests/test_integration_clique_nat.py.in +++ b/src/integration-tests/test_integration_clique_nat.py.in @@ -63,7 +63,7 @@ def success_cont (check): def fail_cont (check): global success success= False; - check.eval(True) + check.evaluate(True) def check_disconnect_client (): @@ -87,7 +87,7 @@ def success_disconnect_server_cont (check): def fail_disconnect_server_cont (check): global success success= False; - check.eval(True) + check.evaluate(False) def check_disconnect_server (): @@ -116,7 +116,7 @@ def success_connect_cont (check): def fail_connect_cont (check): global success success= False; - check.eval(True) + check.evaluate(False) def check_connect (): diff --git a/src/integration-tests/test_integration_disconnect.py.in b/src/integration-tests/test_integration_disconnect.py.in index 4c08289f5..5e137cfff 100755 --- a/src/integration-tests/test_integration_disconnect.py.in +++ b/src/integration-tests/test_integration_disconnect.py.in @@ -64,7 +64,7 @@ def success_disconnect_cont (check): def fail_disconnect_cont (check): global success success = False; - check.eval(True) + check.evaluate(True) def check_disconnect (): @@ -86,7 +86,7 @@ def success_connect_cont (check): def fail_connect_cont (check): global success success= False; - check.eval(True) + check.evaluate(True) def check_connect (): diff --git a/src/integration-tests/test_integration_restart.py.in b/src/integration-tests/test_integration_restart.py.in index 6a5c2ba4f..e2a72e729 100755 --- a/src/integration-tests/test_integration_restart.py.in +++ b/src/integration-tests/test_integration_restart.py.in @@ -68,7 +68,7 @@ def success_restart_cont (check): def fail_restart_cont (check): global success success = False; - check.eval(True) + check.evaluate(True) def success_connect_cont (check): @@ -101,7 +101,7 @@ def success_connect_cont (check): def fail_connect_cont (check): global success success= False; - check.eval(True) + check.evaluate(True) def check_connect (): -- cgit v1.2.3