#------------------------------------------------------------------------------- # Copyright (C) 2012 The IPython Development Team # # Distributed under the terms of the BSD License. The full license is in # the file COPYING, distributed as part of this software. #------------------------------------------------------------------------------- #----------------------------------------------------------------------------- # Imports #----------------------------------------------------------------------------- from __future__ import print_function # Standard library imports from io import StringIO import sys import unittest # Local imports from IPython.kernel.inprocess.blocking import BlockingInProcessKernelClient from IPython.kernel.inprocess.manager import InProcessKernelManager from IPython.kernel.inprocess.ipkernel import InProcessKernel from IPython.testing.decorators import skipif_not_matplotlib from IPython.utils.io import capture_output from IPython.utils import py3compat #----------------------------------------------------------------------------- # Test case #----------------------------------------------------------------------------- class InProcessKernelTestCase(unittest.TestCase): def setUp(self): self.km = InProcessKernelManager() self.km.start_kernel() self.kc = BlockingInProcessKernelClient(kernel=self.km.kernel) self.kc.start_channels() @skipif_not_matplotlib def test_pylab(self): """ Does pylab work in the in-process kernel? """ kc = self.kc kc.execute('%pylab') msg = get_stream_message(kc) self.assert_('matplotlib' in msg['content']['data']) def test_raw_input(self): """ Does the in-process kernel handle raw_input correctly? """ io = StringIO('foobar\n') sys_stdin = sys.stdin sys.stdin = io try: if py3compat.PY3: self.kc.execute('x = input()') else: self.kc.execute('x = raw_input()') finally: sys.stdin = sys_stdin self.assertEqual(self.km.kernel.shell.user_ns.get('x'), 'foobar') def test_stdout(self): """ Does the in-process kernel correctly capture IO? """ kernel = InProcessKernel() with capture_output() as io: kernel.shell.run_cell('print("foo")') self.assertEqual(io.stdout, 'foo\n') kc = BlockingInProcessKernelClient(kernel=kernel) kernel.frontends.append(kc) kc.shell_channel.execute('print("bar")') msg = get_stream_message(kc) self.assertEqual(msg['content']['data'], 'bar\n') #----------------------------------------------------------------------------- # Utility functions #----------------------------------------------------------------------------- def get_stream_message(kernel_client, timeout=5): """ Gets a single stream message synchronously from the sub channel. """ while True: msg = kernel_client.get_iopub_msg(timeout=timeout) if msg['header']['msg_type'] == 'stream': return msg if __name__ == '__main__': unittest.main()