The server layer allows to start servers which are listening to a specific port, by providing the startup command.
>>> from lovely.testlayers import server
>>> sl = server.ServerLayer('sl1', servers=['localhost:33333'],
... start_cmd='nc -k -l 33333')
Setting up the layer starts the server.
>>> sl.setUp()
Now we can acces the server port.
>>> from lovely.testlayers import util
>>> util.isUp('localhost', 33333)
True
No more after teardown.
>>> sl.tearDown()
>>> util.isUp('localhost', 33333)
False
If the command startup fails an error gets raised.
>>> sl = server.ServerLayer('sl1', servers=['localhost:33333'],
... start_cmd='false')
>>> sl.setUp()
Traceback (most recent call last):
...
SystemError: Failed to start server rc=1 cmd=false
It’s possible to specify a logfile for stdout and stderr:
>>> import os
>>> logPath = project_path('var', 'log', 'stdout.log')
>>> sl = server.ServerLayer('sl2', servers=['localhost:33333'],
... start_cmd='nc -k -l 33333',
... stdout=logPath)
Setup the layer starts the server:
>>> sl.setUp()
Get the current position of stdout:
>>> pos = sl.stdout.tell()
Send a message to the server:
>>> _ = run('echo "GET / HTTP/1.0" | nc localhost 33333')
The message gets logged to stdout:
>>> _ = sl.stdout.seek(pos)
>>> print(sl.stdout.read())
GET / HTTP/1.0
After teardown the file gets closed:
>>> sl.tearDown()
>>> sl.stdout.closed
True
After calling setUp again, the file gets repoened:
>>> sl.setUp()
>>> pos = sl.stdout.tell()
>>> _ = run('echo "Hi" | nc localhost 33333')
>>> _ = sl.stdout.seek(pos)
>>> print(sl.stdout.read())
Hi
>>> sl.tearDown()
It’s also possible to initialize a ServerLayer with a file object:
>>> path = project_path('var', 'log', 'stdout_2.log')
>>> f = open(path, 'w+')
>>> sl = server.ServerLayer('sl2', servers=['localhost:33333'],
... start_cmd='nc -k -l 33333',
... stdout=f)
>>> sl.setUp()
>>> pos = sl.stdout.tell()
>>> _ = run('echo "Test" | nc localhost 33333')
>>> _ = sl.stdout.seek(pos)
>>> print(sl.stdout.read())
Test
>>> sl.tearDown()
After teardown the file gets closed:
>>> sl.stdout.closed
True
The file gets reopened after setUp:
>>> sl.setUp()
>>> pos = sl.stdout.tell()
>>> _ = run('echo "File gets reopened" | nc localhost 33333')
>>> _ = sl.stdout.seek(pos)
>>> print(sl.stdout.read())
File gets reopened
>>> sl.tearDown()
If a directory gets specified, a logfile within the directory gets created:
>>> path = project_path('var', 'log')
>>> sl = server.ServerLayer('myLayer', servers=['localhost:33333'],
... start_cmd='nc -k -l 33333',
... stdout=path,
... stderr=path)
>>> sl.setUp()
>>> sl.stdout.name
'...var/log/myLayer_stdout.log'
>>> sl.stderr.name
'...var/log/myLayer_stderr.log'
>>> sl.tearDown()