##############################################################################
#
# Copyright (c) 2005 Zope Corporation and Contributors.
# All Rights Reserved.
#
# This software is subject to the provisions of the Zope Public License,
# Version 2.1 (ZPL).  A copy of the ZPL should accompany this distribution.
# THIS SOFTWARE IS PROVIDED "AS IS" AND ANY AND ALL EXPRESS OR IMPLIED
# WARRANTIES ARE DISCLAIMED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
# WARRANTIES OF TITLE, MERCHANTABILITY, AGAINST INFRINGEMENT, AND FITNESS
# FOR A PARTICULAR PURPOSE.
#
##############################################################################
"""Tests for zope.server.serverbase

$Id: test_serverbase.py 41111 2006-01-03 19:02:50Z jim $
"""
import unittest

from zope.testing import doctest


def doctest_ServerBase():
    r"""Regression test for ServerBase

    Bug: if the `ip` argument of ServerBase is a string containing a numberic
    IP address, and the verbose argument is enabled, ServerBase.__init__
    would try to use self.logger before it was initialized.

    We will use a subclass of ServerBase so that unit tests do not actually try
    to bind to ports.

        >>> from zope.server.serverbase import ServerBase
        >>> class ServerBaseForTest(ServerBase):
        ...     def bind(self, (ip, port)):
        ...         print "Listening on %s:%d" % (ip or '*', port)
        >>> sb = ServerBaseForTest('127.0.0.1', 80, start=False, verbose=True)
        Listening on 127.0.0.1:80

    """

class FakeSocket:
    data        = ''
    setblocking = lambda *_: None
    fileno      = lambda *_: 42
    getpeername = lambda *_: ('localhost', 42)

    def send(self, data):
        self.data += data
        return len(data)
    

def channels_accept_iterables():
    r"""
Channels accept iterables (they special-case strings).

    >>> from zope.server.dualmodechannel import DualModeChannel
    >>> socket = FakeSocket()
    >>> channel = DualModeChannel(socket, ('localhost', 42))

    >>> channel.write("First")
    5
    
    >>> channel.flush()
    >>> print socket.data
    First

    >>> channel.write(["\n", "Second", "\n", "Third"])
    13
    
    >>> channel.flush()
    >>> print socket.data
    First
    Second
    Third

    >>> def count():
    ...     yield '\n1\n2\n3\n'
    ...     yield 'I love to count. Ha ha ha.'

    >>> channel.write(count())
    33
    
    >>> channel.flush()
    >>> print socket.data
    First
    Second
    Third
    1
    2
    3
    I love to count. Ha ha ha.
    
"""

def test_suite():
    return doctest.DocTestSuite()


if __name__ == '__main__':
    unittest.main(defaultTest='test_suite')
