import socket

import threading

import poplib

import time



from unittest import TestCase

from test import test_support



HOST = test_support.HOST



def server(evt, serv):

    serv.listen(5)

    try:

        conn, addr = serv.accept()

    except socket.timeout:

        pass

    else:

        conn.send("+ Hola mundo\n")

        conn.close()

    finally:

        serv.close()

        evt.set()



class GeneralTests(TestCase):



    def setUp(self):

        self.evt = threading.Event()

        self.sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

        self.sock.settimeout(3)

        self.port = test_support.bind_port(self.sock)

        threading.Thread(target=server, args=(self.evt,self.sock)).start()

        time.sleep(.1)



    def tearDown(self):

        self.evt.wait()



    def testBasic(self):

        # connects

        pop = poplib.POP3(HOST, self.port)

        pop.sock.close()



    def testTimeoutDefault(self):

        self.assertTrue(socket.getdefaulttimeout() is None)

        socket.setdefaulttimeout(30)

        try:

            pop = poplib.POP3("localhost", self.port)

        finally:

            socket.setdefaulttimeout(None)

        self.assertEqual(pop.sock.gettimeout(), 30)

        pop.sock.close()



    def testTimeoutNone(self):

        self.assertTrue(socket.getdefaulttimeout() is None)

        socket.setdefaulttimeout(30)

        try:

            pop = poplib.POP3(HOST, self.port, timeout=None)

        finally:

            socket.setdefaulttimeout(None)

        self.assertTrue(pop.sock.gettimeout() is None)

        pop.sock.close()



    def testTimeoutValue(self):

        pop = poplib.POP3("localhost", self.port, timeout=30)

        self.assertEqual(pop.sock.gettimeout(), 30)

        pop.sock.close()





def test_main(verbose=None):

    test_support.run_unittest(GeneralTests)



if __name__ == '__main__':

    test_main()

