blob: ea9daff14e39e68ad37898400a7cdc1f7afac0f9 [file] [log] [blame]
'''
@author Fabio Zadrozny
'''
import sys
import os
from _pydev_imps._pydev_thread import start_new_thread
#make it as if we were executing from the directory above this one (so that we can use pycompletionserver
#without the need for it being in the pythonpath)
sys.argv[0] = os.path.dirname(sys.argv[0])
#twice the dirname to get the previous level from this file.
sys.path.insert(1, os.path.join(os.path.dirname(sys.argv[0])))
IS_PYTHON_3K = 0
if sys.platform.find('java') == -1:
try:
import __builtin__ #@UnusedImport
BUILTIN_MOD = '__builtin__'
except ImportError:
BUILTIN_MOD = 'builtins'
try:
import inspect
import pycompletionserver
import socket
try:
from urllib import quote_plus, unquote_plus
def send(s, msg):
s.send(msg)
except ImportError:
IS_PYTHON_3K = 1
from urllib.parse import quote_plus, unquote_plus #Python 3.0
def send(s, msg):
s.send(bytearray(msg, 'utf-8'))
except ImportError:
pass #Not available in jython
import unittest
class Test(unittest.TestCase):
def setUp(self):
unittest.TestCase.setUp(self)
def tearDown(self):
unittest.TestCase.tearDown(self)
def testMessage(self):
t = pycompletionserver.CompletionServer(0)
l = []
l.append(('Def', 'description' , 'args'))
l.append(('Def1', 'description1', 'args1'))
l.append(('Def2', 'description2', 'args2'))
msg = t.processor.formatCompletionMessage(None, l)
self.assertEquals('@@COMPLETIONS(None,(Def,description,args),(Def1,description1,args1),(Def2,description2,args2))END@@', msg)
l = []
l.append(('Def', 'desc,,r,,i()ption', ''))
l.append(('Def(1', 'descriptio(n1', ''))
l.append(('De,f)2', 'de,s,c,ription2', ''))
msg = t.processor.formatCompletionMessage(None, l)
self.assertEquals('@@COMPLETIONS(None,(Def,desc%2C%2Cr%2C%2Ci%28%29ption, ),(Def%281,descriptio%28n1, ),(De%2Cf%292,de%2Cs%2Cc%2Cription2, ))END@@', msg)
def createConnections(self, p1=50002):
'''
Creates the connections needed for testing.
'''
server = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
server.bind((pycompletionserver.HOST, p1))
server.listen(1) #socket to receive messages.
t = pycompletionserver.CompletionServer(p1)
t.exit_process_on_kill = False
start_new_thread(t.run, ())
s, addr = server.accept()
return t, s
def readMsg(self):
finish = False
msg = ''
while finish == False:
m = self.socket.recv(1024 * 4)
if IS_PYTHON_3K:
m = m.decode('utf-8')
if m.startswith('@@PROCESSING'):
sys.stdout.write('Status msg: %s\n' % (msg,))
else:
msg += m
if msg.find('END@@') != -1:
finish = True
return msg
def testCompletionSocketsAndMessages(self):
t, socket = self.createConnections()
self.socket = socket
try:
#now that we have the connections all set up, check the code completion messages.
msg = quote_plus('math')
send(socket, '@@IMPORTS:%sEND@@' % msg) #math completions
completions = self.readMsg()
#print_ unquote_plus(completions)
#math is a builtin and because of that, it starts with None as a file
start = '@@COMPLETIONS(None,(__doc__,'
start_2 = '@@COMPLETIONS(None,(__name__,'
if '/math.so,' in completions or '/math.cpython-33m.so,' in completions or '/math.cpython-34m.so,' in completions:
return
self.assert_(completions.startswith(start) or completions.startswith(start_2), '%s DOESNT START WITH %s' % (completions, (start, start_2)))
self.assert_('@@COMPLETIONS' in completions)
self.assert_('END@@' in completions)
#now, test i
msg = quote_plus('%s.list' % BUILTIN_MOD)
send(socket, "@@IMPORTS:%s\nEND@@" % msg)
found = self.readMsg()
self.assert_('sort' in found, 'Could not find sort in: %s' % (found,))
#now, test search
msg = quote_plus('inspect.ismodule')
send(socket, '@@SEARCH%sEND@@' % msg) #math completions
found = self.readMsg()
self.assert_('inspect.py' in found)
self.assert_('33' in found or '34' in found or '51' in found or '50' in found, 'Could not find 33, 34, 50 or 51 in %s' % found)
#now, test search
msg = quote_plus('inspect.CO_NEWLOCALS')
send(socket, '@@SEARCH%sEND@@' % msg) #math completions
found = self.readMsg()
self.assert_('inspect.py' in found)
self.assert_('CO_NEWLOCALS' in found)
#now, test search
msg = quote_plus('inspect.BlockFinder.tokeneater')
send(socket, '@@SEARCH%sEND@@' % msg)
found = self.readMsg()
self.assert_('inspect.py' in found)
# self.assert_('CO_NEWLOCALS' in found)
#reload modules test
# send(socket, '@@RELOAD_MODULES_END@@')
# ok = self.readMsg()
# self.assertEquals('@@MSG_OK_END@@' , ok)
# this test is not executed because it breaks our current enviroment.
finally:
try:
sys.stdout.write('succedded...sending kill msg\n')
self.sendKillMsg(socket)
# while not hasattr(t, 'ended'):
# pass #wait until it receives the message and quits.
socket.close()
self.socket.close()
except:
pass
def sendKillMsg(self, socket):
socket.send(pycompletionserver.MSG_KILL_SERVER)
if __name__ == '__main__':
if sys.platform.find('java') == -1:
unittest.main()
else:
sys.stdout.write('Not running python tests in platform: %s\n' % (sys.platform,))