import os
from eventlet.support import six
from tests.patcher_test import ProcessBase
from tests import skip_with_pyevent


class Socket(ProcessBase):
    def test_patched_thread(self):
        new_mod = """from eventlet.green import socket
socket.gethostbyname('localhost')
socket.getaddrinfo('localhost', 80)
"""
        os.environ['EVENTLET_TPOOL_DNS'] = 'yes'
        try:
            self.write_to_tempfile("newmod", new_mod)
            output, lines = self.launch_subprocess('newmod.py')
            self.assertEqual(len(lines), 1, lines)
        finally:
            del os.environ['EVENTLET_TPOOL_DNS']


class Tpool(ProcessBase):
    @skip_with_pyevent
    def test_tpool_size(self):
        expected = "40"
        normal = "20"
        new_mod = """from eventlet import tpool
import eventlet
import time
current = [0]
highwater = [0]
def count():
    current[0] += 1
    time.sleep(0.1)
    if current[0] > highwater[0]:
        highwater[0] = current[0]
    current[0] -= 1
expected = %s
normal = %s
p = eventlet.GreenPool()
for i in range(expected*2):
    p.spawn(tpool.execute, count)
p.waitall()
assert highwater[0] > 20, "Highwater %%s  <= %%s" %% (highwater[0], normal)
"""
        os.environ['EVENTLET_THREADPOOL_SIZE'] = expected
        try:
            self.write_to_tempfile("newmod", new_mod % (expected, normal))
            output, lines = self.launch_subprocess('newmod.py')
            self.assertEqual(len(lines), 1, lines)
        finally:
            del os.environ['EVENTLET_THREADPOOL_SIZE']

    def test_tpool_negative(self):
        new_mod = """from eventlet import tpool
import eventlet
import time
def do():
    print("should not get here")
try:
    tpool.execute(do)
except AssertionError:
    print("success")
"""
        os.environ['EVENTLET_THREADPOOL_SIZE'] = "-1"
        try:
            self.write_to_tempfile("newmod", new_mod)
            output, lines = self.launch_subprocess('newmod.py')
            self.assertEqual(len(lines), 2, lines)
            self.assertEqual(lines[0], "success", output)
        finally:
            del os.environ['EVENTLET_THREADPOOL_SIZE']

    def test_tpool_zero(self):
        new_mod = """from eventlet import tpool
import eventlet
import time
def do():
    print("ran it")
tpool.execute(do)
"""
        os.environ['EVENTLET_THREADPOOL_SIZE'] = "0"
        try:
            self.write_to_tempfile("newmod", new_mod)
            output, lines = self.launch_subprocess('newmod.py')
            self.assertEqual(len(lines), 4, lines)
            self.assertEqual(lines[-2], 'ran it', lines)
            assert 'Warning' in lines[1] or 'Warning' in lines[0], lines
        finally:
            del os.environ['EVENTLET_THREADPOOL_SIZE']


class Hub(ProcessBase):

    def setUp(self):
        super(Hub, self).setUp()
        self.old_environ = os.environ.get('EVENTLET_HUB')
        os.environ['EVENTLET_HUB'] = 'selects'

    def tearDown(self):
        if self.old_environ:
            os.environ['EVENTLET_HUB'] = self.old_environ
        else:
            del os.environ['EVENTLET_HUB']
        super(Hub, self).tearDown()

    def test_eventlet_hub(self):
        new_mod = """from eventlet import hubs
print(hubs.get_hub())
"""
        self.write_to_tempfile("newmod", new_mod)
        output, lines = self.launch_subprocess('newmod.py')
        self.assertEqual(len(lines), 2, "\n".join(lines))
        assert "selects" in lines[0]
