def test_xml_rpc_communication(self): import sys sys.path.insert(0, os.path.join(os.path.dirname(__file__), 'samples')) notifications = [] class Server: def __init__(self, notifications): self.notifications = notifications def notifyConnected(self): #This method is called at the very start (in runfiles.py), and we do not check this here raise AssertionError('Should not be called from the run tests.') def notifyTestsCollected(self, number_of_tests): self.notifications.append(('notifyTestsCollected', number_of_tests)) def notifyStartTest(self, file, test): pass def notifyTest(self, cond, captured_output, error_contents, file, test, time): try: #I.e.: when marked as Binary in xml-rpc captured_output = captured_output.data except: pass try: #I.e.: when marked as Binary in xml-rpc error_contents = error_contents.data except: pass if error_contents: error_contents = error_contents.splitlines()[-1].strip() self.notifications.append(('notifyTest', cond, captured_output.strip(), error_contents, file, test)) def notifyTestRunFinished(self, total_time): self.notifications.append(('notifyTestRunFinished',)) server = Server(notifications) pydev_runfiles_xml_rpc.set_server(server) simple_test = os.path.join(self.file_dir[0], 'simple_test.py') simple_test2 = os.path.join(self.file_dir[0], 'simple2_test.py') simpleClass_test = os.path.join(self.file_dir[0], 'simpleClass_test.py') simpleModule_test = os.path.join(self.file_dir[0], 'simpleModule_test.py') files_to_tests = {} files_to_tests.setdefault(simple_test , []).append('SampleTest.test_xxxxxx1') files_to_tests.setdefault(simple_test , []).append('SampleTest.test_xxxxxx2') files_to_tests.setdefault(simple_test , []).append('SampleTest.test_non_unique_name') files_to_tests.setdefault(simple_test2, []).append('YetAnotherSampleTest.test_abc') files_to_tests.setdefault(simpleClass_test, []).append('SetUpClassTest.test_blank') files_to_tests.setdefault(simpleModule_test, []).append('SetUpModuleTest.test_blank') self._setup_scenario(None, files_to_tests=files_to_tests) self.MyTestRunner.verbosity = 2 buf = pydevd_io.start_redirect(keep_original_redirection=False) try: self.MyTestRunner.run_tests() self.assertEqual(8, len(notifications)) expected = [ ('notifyTestsCollected', 6), ('notifyTest', 'ok', 'non unique name ran', '', simple_test, 'SampleTest.test_non_unique_name'), ('notifyTest', 'fail', '', 'AssertionError: Fail test 2', simple_test, 'SampleTest.test_xxxxxx1'), ('notifyTest', 'ok', '', '', simple_test, 'SampleTest.test_xxxxxx2'), ('notifyTest', 'ok', '', '', simple_test2, 'YetAnotherSampleTest.test_abc'), ] if not IS_JYTHON: if 'samples.simpleClass_test' in str(notifications): expected.append(('notifyTest', 'error', '', 'ValueError: This is an INTENTIONAL value error in setUpClass.', simpleClass_test.replace('/', os.path.sep), 'samples.simpleClass_test.SetUpClassTest <setUpClass>')) expected.append(('notifyTest', 'error', '', 'ValueError: This is an INTENTIONAL value error in setUpModule.', simpleModule_test.replace('/', os.path.sep), 'samples.simpleModule_test <setUpModule>')) else: expected.append(('notifyTest', 'error', '', 'ValueError: This is an INTENTIONAL value error in setUpClass.', simpleClass_test.replace('/', os.path.sep), 'simpleClass_test.SetUpClassTest <setUpClass>')) expected.append(('notifyTest', 'error', '', 'ValueError: This is an INTENTIONAL value error in setUpModule.', simpleModule_test.replace('/', os.path.sep), 'simpleModule_test <setUpModule>')) else: expected.append(('notifyTest', 'ok', '', '', simpleClass_test, 'SetUpClassTest.test_blank')) expected.append(('notifyTest', 'ok', '', '', simpleModule_test, 'SetUpModuleTest.test_blank')) expected.append(('notifyTestRunFinished',)) expected.sort() new_notifications = [] for notification in expected: try: if len(notification) == 6: # Some are binary on Py3. new_notifications.append(( notification[0], notification[1], notification[2].encode('latin1'), notification[3].encode('latin1'), notification[4], notification[5], )) else: new_notifications.append(notification) except: raise expected = new_notifications notifications.sort() self.assertEqual( expected, notifications ) finally: pydevd_io.end_redirect() b = buf.getvalue() if not IS_JYTHON: self.assert_(b.find('Ran 4 tests in ') != -1, 'Found: ' + b) else: self.assert_(b.find('Ran 6 tests in ') != -1, 'Found: ' + b)
def run_client(job_id, port, verbosity, coverage_output_file, coverage_include): job_id = int(job_id) from _pydev_bundle import pydev_localhost server = xmlrpclib.Server('http://%s:%s' % (pydev_localhost.get_localhost(), port)) server.lock = threading.Lock() server_comm = ServerComm(job_id, server) server_comm.start() try: server_facade = ServerFacade(server_comm.notifications_queue) from _pydev_runfiles import pydev_runfiles from _pydev_runfiles import pydev_runfiles_xml_rpc pydev_runfiles_xml_rpc.set_server(server_facade) #Starts None and when the 1st test is gotten, it's started (because a server may be initiated and terminated #before receiving any test -- which would mean a different process got all the tests to run). coverage = None try: tests_to_run = [1] while tests_to_run: #Investigate: is it dangerous to use the same xmlrpclib server from different threads? #It seems it should be, as it creates a new connection for each request... server.lock.acquire() try: tests_to_run = server.GetTestsToRun(job_id) finally: server.lock.release() if not tests_to_run: break if coverage is None: _coverage_files, coverage = start_coverage_support_from_params( None, coverage_output_file, 1, coverage_include) files_to_tests = {} for test in tests_to_run: filename_and_test = test.split('|') if len(filename_and_test) == 2: files_to_tests.setdefault(filename_and_test[0], []).append(filename_and_test[1]) configuration = pydev_runfiles.Configuration( '', verbosity, None, None, None, files_to_tests, 1, #Always single job here None, #The coverage is handled in this loop. coverage_output_file=None, coverage_include=None, ) test_runner = pydev_runfiles.PydevTestRunner(configuration) sys.stdout.flush() test_runner.run_tests(handle_coverage=False) finally: if coverage is not None: coverage.stop() coverage.save() except: traceback.print_exc() server_comm.notifications_queue.put_nowait(KillServer())
def test_xml_rpc_communication(self): import sys sys.path.insert(0, os.path.join(os.path.dirname(__file__), 'samples')) notifications = [] class Server: def __init__(self, notifications): self.notifications = notifications def notifyConnected(self): #This method is called at the very start (in runfiles.py), and we do not check this here raise AssertionError( 'Should not be called from the run tests.') def notifyTestsCollected(self, number_of_tests): self.notifications.append( ('notifyTestsCollected', number_of_tests)) def notifyStartTest(self, file, test): pass def notifyTest(self, cond, captured_output, error_contents, file, test, time): try: #I.e.: when marked as Binary in xml-rpc captured_output = captured_output.data except: pass try: #I.e.: when marked as Binary in xml-rpc error_contents = error_contents.data except: pass if error_contents: error_contents = error_contents.splitlines()[-1].strip() self.notifications.append( ('notifyTest', cond, captured_output.strip(), error_contents, file, test)) def notifyTestRunFinished(self, total_time): self.notifications.append(('notifyTestRunFinished', )) server = Server(notifications) pydev_runfiles_xml_rpc.set_server(server) simple_test = os.path.join(self.file_dir[0], 'simple_test.py') simple_test2 = os.path.join(self.file_dir[0], 'simple2_test.py') simpleClass_test = os.path.join(self.file_dir[0], 'simpleClass_test.py') simpleModule_test = os.path.join(self.file_dir[0], 'simpleModule_test.py') files_to_tests = {} files_to_tests.setdefault(simple_test, []).append('SampleTest.test_xxxxxx1') files_to_tests.setdefault(simple_test, []).append('SampleTest.test_xxxxxx2') files_to_tests.setdefault(simple_test, []).append('SampleTest.test_non_unique_name') files_to_tests.setdefault(simple_test2, []).append('YetAnotherSampleTest.test_abc') files_to_tests.setdefault(simpleClass_test, []).append('SetUpClassTest.test_blank') files_to_tests.setdefault(simpleModule_test, []).append('SetUpModuleTest.test_blank') self._setup_scenario(None, files_to_tests=files_to_tests) self.MyTestRunner.verbosity = 2 buf = pydevd_io.start_redirect(keep_original_redirection=False) try: self.MyTestRunner.run_tests() self.assertEqual(8, len(notifications)) if sys.version_info[:2] <= (2, 6): # The setUpClass is not supported in Python 2.6 (thus we have no collection error). expected = [ ('notifyTest', 'fail', '', 'AssertionError: Fail test 2', simple_test, 'SampleTest.test_xxxxxx1'), ('notifyTest', 'ok', '', '', simple_test2, 'YetAnotherSampleTest.test_abc'), ('notifyTest', 'ok', '', '', simpleClass_test, 'SetUpClassTest.test_blank'), ('notifyTest', 'ok', '', '', simpleModule_test, 'SetUpModuleTest.test_blank'), ('notifyTest', 'ok', '', '', simple_test, 'SampleTest.test_xxxxxx2'), ('notifyTest', 'ok', 'non unique name ran', '', simple_test, 'SampleTest.test_non_unique_name'), ('notifyTestRunFinished', ), ('notifyTestsCollected', 6) ] else: expected = [ ('notifyTestsCollected', 6), ('notifyTest', 'ok', 'non unique name ran', '', simple_test, 'SampleTest.test_non_unique_name'), ('notifyTest', 'fail', '', 'AssertionError: Fail test 2', simple_test, 'SampleTest.test_xxxxxx1'), ('notifyTest', 'ok', '', '', simple_test, 'SampleTest.test_xxxxxx2'), ('notifyTest', 'ok', '', '', simple_test2, 'YetAnotherSampleTest.test_abc'), ] if not IS_JYTHON: if 'samples.simpleClass_test' in str(notifications): expected.append(( 'notifyTest', 'error', '', 'ValueError: This is an INTENTIONAL value error in setUpClass.', simpleClass_test.replace('/', os.path.sep), 'samples.simpleClass_test.SetUpClassTest <setUpClass>' )) expected.append(( 'notifyTest', 'error', '', 'ValueError: This is an INTENTIONAL value error in setUpModule.', simpleModule_test.replace('/', os.path.sep), 'samples.simpleModule_test <setUpModule>')) else: expected.append(( 'notifyTest', 'error', '', 'ValueError: This is an INTENTIONAL value error in setUpClass.', simpleClass_test.replace('/', os.path.sep), 'simpleClass_test.SetUpClassTest <setUpClass>')) expected.append(( 'notifyTest', 'error', '', 'ValueError: This is an INTENTIONAL value error in setUpModule.', simpleModule_test.replace('/', os.path.sep), 'simpleModule_test <setUpModule>')) else: expected.append( ('notifyTest', 'ok', '', '', simpleClass_test, 'SetUpClassTest.test_blank')) expected.append( ('notifyTest', 'ok', '', '', simpleModule_test, 'SetUpModuleTest.test_blank')) expected.append(('notifyTestRunFinished', )) expected.sort() new_notifications = [] for notification in expected: try: if len(notification) == 6: # Some are binary on Py3. new_notifications.append(( notification[0], notification[1], notification[2].encode('latin1'), notification[3].encode('latin1'), notification[4], notification[5], )) else: new_notifications.append(notification) except: raise expected = new_notifications notifications.sort() if not IS_JYTHON: self.assertEqual(expected, notifications) finally: pydevd_io.end_redirect() b = buf.getvalue() if sys.version_info[:2] > (2, 6): self.assertTrue(b.find('Ran 4 tests in ') != -1, 'Found: ' + b) else: self.assertTrue(b.find('Ran 6 tests in ') != -1, 'Found: ' + b)
def run_client(job_id, port, verbosity, coverage_output_file, coverage_include): job_id = int(job_id) from _pydev_bundle import pydev_localhost server = xmlrpclib.Server('http://%s:%s' % (pydev_localhost.get_localhost(), port)) server.lock = threading.Lock() server_comm = ServerComm(job_id, server) server_comm.start() try: server_facade = ServerFacade(server_comm.notifications_queue) from _pydev_runfiles import pydev_runfiles from _pydev_runfiles import pydev_runfiles_xml_rpc pydev_runfiles_xml_rpc.set_server(server_facade) #Starts None and when the 1st test is gotten, it's started (because a server may be initiated and terminated #before receiving any test -- which would mean a different process got all the tests to run). coverage = None try: tests_to_run = [1] while tests_to_run: #Investigate: is it dangerous to use the same xmlrpclib server from different threads? #It seems it should be, as it creates a new connection for each request... server.lock.acquire() try: tests_to_run = server.GetTestsToRun(job_id) finally: server.lock.release() if not tests_to_run: break if coverage is None: _coverage_files, coverage = start_coverage_support_from_params( None, coverage_output_file, 1, coverage_include) files_to_tests = {} for test in tests_to_run: filename_and_test = test.split('|') if len(filename_and_test) == 2: files_to_tests.setdefault(filename_and_test[0], []).append( filename_and_test[1]) configuration = pydev_runfiles.Configuration( '', verbosity, None, None, None, files_to_tests, 1, #Always single job here None, #The coverage is handled in this loop. coverage_output_file=None, coverage_include=None, ) test_runner = pydev_runfiles.PydevTestRunner(configuration) sys.stdout.flush() test_runner.run_tests(handle_coverage=False) finally: if coverage is not None: coverage.stop() coverage.save() except: traceback.print_exc() server_comm.notifications_queue.put_nowait(KillServer())