On Wed, Aug 15, 2012 at 02:49:40PM +0200, Jan Tluka wrote:
> Wed, Aug 15, 2012 at 02:29:51PM CEST, jpirko(a)redhat.com wrote:
> >Wed, Aug 15, 2012 at 02:21:58PM CEST, rpazdera(a)redhat.com wrote:
> >>On Tue, Aug 14, 2012 at 04:22:48PM +0200, Jan Tluka wrote:
> >>> Tue, Aug 14, 2012 at 04:11:44PM CEST, jpirko(a)redhat.com wrote:
> >>> >
> >>> >Applying: TCPListen and TCPConnect test set added
> >>> >/home/jirka/work/lnst/.git/rebase-apply/patch:205: trailing
whitespace.
> >>> > Test spawns server(s) listening for TCP connection(s) on port(s)
defined by
> >>> >warning: 1 line adds whitespace errors.
> >>
> >>Those whitespace errors can be *really* annoying ...
> >>
> >>I have them them in almost every patch I create.
> >>Are there any tools or methods for avoiding them?
> >
> >
> >Correct editor setup ? ;)
> >
>
> Ok, Jiri. Please be more helpful next time!
>
> This is what I use in ~/.vimrc (thanks to Jiri ;-)
>
> <snip>
> highlight WhitespaceEOL ctermbg=red guibg=red
> match WhitespaceEOL /\s\+$/
> </snip>
>
> This would highlight the whitespaces at the end of lines.
That's exactly what I was looking for!
Thanks! :)
Btw, this could be handy as well. In vim, press : and enter following
substitution,
%s/[ \t]\+$//gc
>
> >>
> >>> >
> >>> >But nevermind for now. I will fix this manually this time :)
> >>>
> >>> Thank you almighty!
> >>>
> >>> >
> >>> >Jiri
> >>> >
> >>> >Mon, Aug 13, 2012 at 03:37:27PM CEST, jtluka(a)redhat.com wrote:
> >>> >>Set of these tests provides possibility to test multiple TCP
connections
> >>> >>within two LNST commands. Data sent are random and every
connection
> >>> >>behaves differently in sense that number of packets is random as
well.
> >>> >>
> >>> >>Following are two examples of commands in command sequence.
> >>> >>
> >>> >> <define>
> >>> >> <alias name="my_range"
value="10000-10100" />
> >>> >> </define>
> >>> >> <command machine_id="1" type="test"
value="TCPListen" bg_id="1">
> >>> >> <options>
> >>> >> <option name="addr"
value="{ip(1,1)}"/>
> >>> >> <option name="port_range"
value="{$my_range}"/>
> >>> >> </options>
> >>> >> </command>
> >>> >> <command type="exec" value="sleep 5"
/>
> >>> >> <command machine_id="2" type="test"
value="TCPConnect" bg_id="2">
> >>> >> <options>
> >>> >> <option name="addr"
value="{ip(1,1)}"/>
> >>> >> <option name="port_range"
value="{$my_range}"/>
> >>> >> <option name="sleep"
value="0.5" />
> >>> >> </options>
> >>> >> </command>
> >>> >> <command machine_id="2" type="wait"
value="2" />
> >>> >> <command machine_id="1" type="wait"
value="1" />
> >>> >>
> >>> >>Repeated generation of connections can be achieved using
following
> >>> >>command (see 'cont' option):
> >>> >>
> >>> >> <define>
> >>> >> <alias name="my_range"
value="10000-10100" />
> >>> >> </define>
> >>> >> <command machine_id="1" type="test"
value="TCPListen" bg_id="1">
> >>> >> <options>
> >>> >> <option name="addr"
value="{ip(1,1)}"/>
> >>> >> <option name="port_range"
value="{$my_range}"/>
> >>> >> <option name="cont"
value="yes" />
> >>> >> </options>
> >>> >> </command>
> >>> >> <command type="exec" value="sleep 5"
/>
> >>> >> <command machine_id="2" type="test"
value="TCPConnect" bg_id="2">
> >>> >> <options>
> >>> >> <option name="addr"
value="{ip(1,1)}"/>
> >>> >> <option name="port_range"
value="{$my_range}"/>
> >>> >> <option name="sleep"
value="0.5" />
> >>> >> <option name="cont"
value="yes" />
> >>> >> </options>
> >>> >> </command>
> >>> >> <command type="exec" value="sleep 60"
/>
> >>> >> <command machine_id="2" type="intr"
value="2" />
> >>> >> <command machine_id="1" type="kill"
value="1" />
> >>> >>
> >>> >>
> >>> >>---
> >>> >> Tests/TestTCPConnect.py | 167
+++++++++++++++++++++++++++++++++++++++++++++++
> >>> >> Tests/TestTCPListen.py | 127
+++++++++++++++++++++++++++++++++++
> >>> >> 2 files changed, 294 insertions(+), 0 deletions(-)
> >>> >> create mode 100644 Tests/TestTCPConnect.py
> >>> >> create mode 100644 Tests/TestTCPListen.py
> >>> >>
> >>> >>diff --git a/Tests/TestTCPConnect.py b/Tests/TestTCPConnect.py
> >>> >>new file mode 100644
> >>> >>index 0000000..0a6c655
> >>> >>--- /dev/null
> >>> >>+++ b/Tests/TestTCPConnect.py
> >>> >>@@ -0,0 +1,167 @@
> >>> >>+"""
> >>> >>+This module defines TCPConnect module
> >>> >>+"""
> >>> >>+
> >>> >>+__author__ = """
> >>> >>+jtluka(a)redhat.com (Jan Tluka)
> >>> >>+"""
> >>> >>+
> >>> >>+import sys
> >>> >>+import socket
> >>> >>+import errno
> >>> >>+from multiprocessing import Process, Lock
> >>> >>+from signal import signal, SIGINT
> >>> >>+from time import sleep
> >>> >>+from random import randrange, sample
> >>> >>+import logging
> >>> >>+import re
> >>> >>+from Common.TestsCommon import TestGeneric
> >>> >>+
> >>> >>+"""
> >>> >>+Test description:
> >>> >>+ Test spawns client(s) connecting to TCP port(s) defined by
port or
> >>> >>+ port_range option. When connected, the client sends random
bursts of
> >>> >>+ random data to server. If cont option is set the
connections are initiated
> >>> >>+ again and data is sent to server until interrupted by the
controller.
> >>> >>+
> >>> >>+Parameters:
> >>> >>+ addr ... mandatory, address to connect to
> >>> >>+ port ... mandatory, port to send data
> >>> >>+ sleep ... optional, sleep time between bursts, if
undefined, the bursts
> >>> >>+ are immediate
> >>> >>+ cont ... optional, sets continuous mode of connecting, if
set connections
> >>> >>+ are infinitely re-spawned when closed
> >>> >>+"""
> >>> >>+
> >>> >>+class ConnectionWorker():
> >>> >>+ def __init__(self, host, port, sleep_time = None,
continuous = None):
> >>> >>+ self._tlock = Lock()
> >>> >>+ self._terminate = 0
> >>> >>+ self._host = host
> >>> >>+ self._port = port
> >>> >>+ self._sleep_time = sleep_time
> >>> >>+ self._cont = continuous
> >>> >>+ self._ascii = [chr(i) for i in range(0,255)]
> >>> >>+
> >>> >>+ def terminate(self):
> >>> >>+ self._tlock.acquire()
> >>> >>+ self._terminate=1
> >>> >>+ self._tlock.release()
> >>> >>+
> >>> >>+ def run(self):
> >>> >>+ loop = True
> >>> >>+
> >>> >>+ while loop:
> >>> >>+ loop = (self._cont is not None)
> >>> >>+ logging.debug("Starting connection to (%s)
port %s " % (self._host,
> >>> >>+ self._port))
> >>> >>+
> >>> >>+ try:
> >>> >>+ s = socket.socket(socket.AF_INET,
socket.SOCK_STREAM)
> >>> >>+ s.connect((self._host, self._port))
> >>> >>+ except socket.error, msg:
> >>> >>+ s.close()
> >>> >>+ s = None
> >>> >>+ logging.error(msg)
> >>> >>+ return
> >>> >>+
> >>> >>+ for txs in range(10, randrange(20,100)):
> >>> >>+ self._tlock.acquire()
> >>> >>+ if self._terminate:
> >>> >>+ self._tlock.release()
> >>> >>+ logging.debug("Terminating connection
on port %s" %
> >>> >>+ self._port)
> >>> >>+ loop = False
> >>> >>+ break
> >>> >>+ else:
> >>> >>+ self._tlock.release()
> >>> >>+
> >>> >>+ rnd_str = "".join(sample(self._ascii,
len(self._ascii)))
> >>> >>+ data = s.sendall(rnd_str)
> >>> >>+ if (self._sleep_time):
> >>> >>+ sleep(self._sleep_time)
> >>> >>+
> >>> >>+ s.close()
> >>> >>+
> >>> >>+
> >>> >>+class TestTCPConnect(TestGeneric):
> >>> >>+ def _parse_options(self):
> >>> >>+ addr = self.get_mopt("addr")
> >>> >>+ if addr:
> >>> >>+ self._host = addr
> >>> >>+
> >>> >>+ # either port or port_range should be set
> >>> >>+ port = self.get_opt("port")
> >>> >>+ if port:
> >>> >>+ self._port = port
> >>> >>+ else:
> >>> >>+ port_range = self.get_opt("port_range")
> >>> >>+ if port_range:
> >>> >>+ self._port_range = port_range
> >>> >>+ else:
> >>> >>+ e = TestOptionMissing()
> >>> >>+ raise e
> >>> >>+
> >>> >>+ sleep_time = float(self.get_opt("sleep"))
> >>> >>+ if sleep_time:
> >>> >>+ self._sleep_time = sleep_time
> >>> >>+
> >>> >>+ cont = self.get_opt("cont")
> >>> >>+ if cont:
> >>> >>+ self._cont = cont
> >>> >>+
> >>> >>+ def parse_port_range(self):
> >>> >>+ if self._port_range == None:
> >>> >>+ return []
> >>> >>+
> >>> >>+ for c in [',','-']:
> >>> >>+ s = self._port_range.split(c)
> >>> >>+ if len(s) == 2:
> >>> >>+ break
> >>> >>+
> >>> >>+ if len(s) != 2:
> >>> >>+ logging.error("Port range malformed! ",
self._port_range)
> >>> >>+
> >>> >>+ low = int(s[0])
> >>> >>+ high = int(s[1]) + 1
> >>> >>+
> >>> >>+ return range(low, high)
> >>> >>+
> >>> >>+ def _close_connections(self, signum, frame):
> >>> >>+ logging.debug("Termination signal delivered
...")
> >>> >>+ for cw in self._cw_instances:
> >>> >>+ cw.terminate()
> >>> >>+
> >>> >>+ def _set_interrupt_handler(self):
> >>> >>+ signal(SIGINT, self._close_connections)
> >>> >>+
> >>> >>+ def run(self):
> >>> >>+ self._terminate = 0
> >>> >>+ self._host = None
> >>> >>+ self._port = None
> >>> >>+ self._cont = None
> >>> >>+ self._cw_instances = []
> >>> >>+
> >>> >>+ self._set_interrupt_handler()
> >>> >>+
> >>> >>+ self._parse_options()
> >>> >>+
> >>> >>+ ports = []
> >>> >>+ if self._port:
> >>> >>+ ports.extend(self._port)
> >>> >>+ else:
> >>> >>+ r = self.parse_port_range()
> >>> >>+ ports.extend(r)
> >>> >>+
> >>> >>+ workers = []
> >>> >>+ for p in ports:
> >>> >>+ cw = ConnectionWorker(self._host, p,
self._sleep_time, self._cont)
> >>> >>+ self._cw_instances.append(cw)
> >>> >>+
> >>> >>+ w = Process(target=cw.run)
> >>> >>+ w.start()
> >>> >>+ workers.append(w)
> >>> >>+
> >>> >>+ logging.debug("Waiting for workers ...")
> >>> >>+ for w in workers:
> >>> >>+ w.join()
> >>> >>diff --git a/Tests/TestTCPListen.py b/Tests/TestTCPListen.py
> >>> >>new file mode 100644
> >>> >>index 0000000..2b25f29
> >>> >>--- /dev/null
> >>> >>+++ b/Tests/TestTCPListen.py
> >>> >>@@ -0,0 +1,127 @@
> >>> >>+"""
> >>> >>+This module defines TCPListen module
> >>> >>+"""
> >>> >>+
> >>> >>+__author__ = """
> >>> >>+jtluka(a)redhat.com (Jan Tluka)
> >>> >>+"""
> >>> >>+
> >>> >>+import sys
> >>> >>+import socket
> >>> >>+import errno
> >>> >>+import logging
> >>> >>+import re
> >>> >>+from multiprocessing import Process
> >>> >>+from Common.TestsCommon import TestGeneric
> >>> >>+
> >>> >>+"""
> >>> >>+Test description:
> >>> >>+ Test spawns server(s) listening for TCP connection(s) on
port(s) defined by
> >>> >>+ port or port_range options. When client connects to the
port, server reads
> >>> >>+ the data sent and close the connection when no more data is
available.
> >>> >>+ If cont option is set the connection is reopened and server
reads data
> >>> >>+ again.
> >>> >>+
> >>> >>+Parameters:
> >>> >>+ addr ... optional, address to bind to, if undefined listen
on all ifaces
> >>> >>+ port ... mandatory, port to listen on
> >>> >>+ cont ... optional, if set the listening port is reopened
when the
> >>> >>+ connection is closed
> >>> >>+"""
> >>> >>+
> >>> >>+class TestTCPListen(TestGeneric):
> >>> >>+ def __init__(self, command):
> >>> >>+ self._addr = None
> >>> >>+ self._port = None
> >>> >>+ self._cont = None
> >>> >>+ TestGeneric.__init__(self, command)
> >>> >>+
> >>> >>+ def _parse_options(self):
> >>> >>+ addr = self.get_opt("addr")
> >>> >>+ if addr:
> >>> >>+ self._addr = addr
> >>> >>+
> >>> >>+ # either port or port_range should be set
> >>> >>+ port = self.get_opt("port")
> >>> >>+ if port:
> >>> >>+ self._port = port
> >>> >>+ else:
> >>> >>+ port_range = self.get_opt("port_range")
> >>> >>+ if port_range:
> >>> >>+ self._port_range = port_range
> >>> >>+ else:
> >>> >>+ e = TestOptionMissing()
> >>> >>+ raise e
> >>> >>+
> >>> >>+ cont = self.get_opt("cont")
> >>> >>+ if cont:
> >>> >>+ self._cont = cont
> >>> >>+
> >>> >>+ def _worker(self, host, port):
> >>> >>+ logging.debug("Starting listener (%s) on port %s
" % (host, port))
> >>> >>+ s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
> >>> >>+
> >>> >>+ try:
> >>> >>+ s.bind((host, port))
> >>> >>+ s.listen(1)
> >>> >>+ except socket.error, msg:
> >>> >>+ s.close()
> >>> >>+ s = None
> >>> >>+ logging.error(msg)
> >>> >>+ return
> >>> >>+
> >>> >>+ loop = 1
> >>> >>+
> >>> >>+ while loop or self._cont:
> >>> >>+ conn, addr = s.accept()
> >>> >>+ logging.debug('Connected from ' + addr[0] +
' port:' +
> >>> >>+ str(addr[1]))
> >>> >>+
> >>> >>+ while 1:
> >>> >>+ data = conn.recv(1024)
> >>> >>+ if not data:
> >>> >>+ logging.debug('Client disconnected:
' + addr[0] +
> >>> >>+ ' port:' +
str(addr[1]))
> >>> >>+ break
> >>> >>+
> >>> >>+ conn.close()
> >>> >>+ loop = 0
> >>> >>+
> >>> >>+ def _parse_port_range(self):
> >>> >>+ if self._port_range == None:
> >>> >>+ return []
> >>> >>+
> >>> >>+ for c in [',','-']:
> >>> >>+ s = self._port_range.split(c)
> >>> >>+ if len(s) == 2:
> >>> >>+ break
> >>> >>+
> >>> >>+ if len(s) != 2:
> >>> >>+ logging.error("Port range malformed! ",
self._port_range)
> >>> >>+
> >>> >>+ low = int(s[0])
> >>> >>+ high = int(s[1]) + 1
> >>> >>+
> >>> >>+ return range(low, high)
> >>> >>+
> >>> >>+ def run(self):
> >>> >>+ self._parse_options()
> >>> >>+
> >>> >>+ ports = []
> >>> >>+ if self._port:
> >>> >>+ ports.extend(self._port)
> >>> >>+ else:
> >>> >>+ r = self._parse_port_range()
> >>> >>+ ports.extend(r)
> >>> >>+
> >>> >>+ workers = []
> >>> >>+
> >>> >>+ for p in ports:
> >>> >>+ w = Process(target=self._worker, args=(self._addr,
p))
> >>> >>+ w.start()
> >>> >>+ workers.append(w)
> >>> >>+
> >>> >>+
> >>> >>+ logging.debug("Waiting for workers ...")
> >>> >>+ for w in workers:
> >>> >>+ w.join()
> >>> >>--
> >>> >>1.7.6.5
> >>> >>
> >>> >>_______________________________________________
> >>> >>LNST-developers mailing list
> >>> >>LNST-developers(a)lists.fedorahosted.org
> >>> >>https://lists.fedorahosted.org/mailman/listinfo/lnst-developers
> >>> _______________________________________________
> >>> LNST-developers mailing list
> >>> LNST-developers(a)lists.fedorahosted.org
> >>>
https://lists.fedorahosted.org/mailman/listinfo/lnst-developers