
# Copyright (c) Twisted Matrix Laboratories.
# See LICENSE for details.


from twisted.trial import unittest
from twisted.manhole import service
from twisted.spread.util import LocalAsRemote

class Dummy:
    pass

class DummyTransport:
    def getHost(self):
        return 'INET', '127.0.0.1', 0

class DummyManholeClient(LocalAsRemote):
    zero = 0
    broker = Dummy()
    broker.transport = DummyTransport()

    def __init__(self):
        self.messages = []

    def console(self, messages):
        self.messages.extend(messages)

    def receiveExplorer(self, xplorer):
        pass

    def setZero(self):
        self.zero = len(self.messages)

    def getMessages(self):
        return self.messages[self.zero:]

    # local interface
    sync_console = console
    sync_receiveExplorer = receiveExplorer
    sync_setZero = setZero
    sync_getMessages = getMessages

class ManholeTest(unittest.TestCase):
    """Various tests for the manhole service.

    Both the the importIdentity and importMain tests are known to fail
    when the __name__ in the manhole namespace is set to certain
    values.
    """
    def setUp(self):
        self.service = service.Service()
        self.p = service.Perspective(self.service)
        self.client = DummyManholeClient()
        self.p.attached(self.client, None)

    def test_importIdentity(self):
        """Making sure imported module is the same as one previously loaded.
        """
        self.p.perspective_do("from twisted.manhole import service")
        self.client.setZero()
        self.p.perspective_do("int(service is sys.modules['twisted.manhole.service'])")
        msg = self.client.getMessages()[0]
        self.assertEqual(msg, ('result',"1\n"))

    def test_importMain(self):
        """Trying to import __main__"""
        self.client.setZero()
        self.p.perspective_do("import __main__")
        if self.client.getMessages():
            msg = self.client.getMessages()[0]
            if msg[0] in ("exception","stderr"):
                self.fail(msg[1])

#if __name__=='__main__':
#    unittest.main()
