Help: Python unit testing

2016-07-05 Thread Harsh Gupta
Hello All,

I have been trying to write a test framework for a pretty simple command server 
application in python. I have not been able to figure out how to test the 
socket server.
I would really appreciate if you could help me out in testing this application 
using unittest. I'm new to this.
Please find the commandserver.py file . 

'''
import socket
import time

supported_commands = {'loopback', 'print', 'close'}

class CommandServer:

def __init__(self, ip='localhost', port=5000):

self.server = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
self.server.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
self.server.bind((ip, port))

print "Server running"
self.is_running = True

def start_listening(self, num_connections=2):
self.server.listen(num_connections)
self._accept()

def is_running(self):
return self.is_running

def _accept(self):
self.client, self.remote_addr = self.server.accept()

print "Received connection from %s" % (self.remote_addr,)
self.is_connected = True

def _get_data(self, bufsize=32):
try:
return self.client.recv(bufsize)
except KeyboardInterrupt:
self.close()

def wait_for_commands(self):
while self.is_connected:
cmd = self._get_data()
if cmd:
if cmd not in supported_commands:
print "Received unsupported command"
continue

if cmd in ("loopback", "print"):
payload = self._get_data(512)

if cmd == "loopback":
self.client.sendall(payload)

elif cmd == "print":
print payload

elif cmd == "close":
self.close()

def close(self):
self.client.close()
self.server.close()
self.is_connected = False
print "Connection closed"

if __name__ == '__main__':

cmd_server = CommandServer()
cmd_server.start_listening()
cmd_server.wait_for_commands()

'''

The tests cases I came up with are:
1. Start the server
2. Establish connection with client
3. Test the server by sending 3 commands
- loopback command should  send all payload.
- print command should print payload
- close command should close the connection between server and client.

4. Raise error if any other command is send other than listed 3 commands

Other nominal cases
1. Check if both the server and client are closed. It might happen that only 
one is closed.
2. Go to sleep/Cancel the connection if no command is received after a certain 
period of time.

Thank You

Harsh
-- 
https://mail.python.org/mailman/listinfo/python-list


Help: Python socket unit test framework

2016-07-05 Thread Harsh Gupta
Hello All,

I have been trying to write a test framework for a pretty simple command server 
application in python. I have not been able to figure out how to test the 
socket server.
I would really appreciate if you could help me out in testing this application 
using unittest.

Please kindly review it.

The tests cases I came up with are:
1. Start the server
2. Establish connection with client
3. Test the server by sending 3 commands
- loopback command should  send all payload.
- print command should print payload
- close command should close the connection between server and client.

4. Raise error if any other command is send other than listed 3 commands

Other nominal cases
1. Check if both the server and client are closed. It might happen that only 
one is closed.
2. Go to sleep/Cancel the connection if no command is received after a certain 
period of time.




import socket
import time

supported_commands = {'loopback', 'print', 'close'}

class CommandServer:

def __init__(self, ip='localhost', port=5000):

self.server = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
self.server.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
self.server.bind((ip, port))

print "Server running"
self.is_running = True

def start_listening(self, num_connections=2):
self.server.listen(num_connections)
self._accept()

def is_running(self):
return self.is_running

def _accept(self):
self.client, self.remote_addr = self.server.accept()

print "Received connection from %s" % (self.remote_addr,)
self.is_connected = True

def _get_data(self, bufsize=32):
try:
return self.client.recv(bufsize)
except KeyboardInterrupt:
self.close()

def wait_for_commands(self):
while self.is_connected:
cmd = self._get_data()
if cmd:
if cmd not in supported_commands:
print "Received unsupported command"
continue

if cmd in ("loopback", "print"):
payload = self._get_data(512)

if cmd == "loopback":
self.client.sendall(payload)

elif cmd == "print":
print payload

elif cmd == "close":
self.close()

def close(self):
self.client.close()
self.server.close()
self.is_connected = False
print "Connection closed"

if __name__ == '__main__':

cmd_server = CommandServer()
cmd_server.start_listening()
cmd_server.wait_for_commands()



Thank You

H
-- 
https://mail.python.org/mailman/listinfo/python-list