# Basic Servier Layer

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

## Logging

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()