##// END OF EJS Templates
fix count when testing composite error output
MinRK -
Show More
@@ -1,786 +1,789 b''
1 # -*- coding: utf-8 -*-
1 # -*- coding: utf-8 -*-
2 """test View objects
2 """test View objects
3
3
4 Authors:
4 Authors:
5
5
6 * Min RK
6 * Min RK
7 """
7 """
8 #-------------------------------------------------------------------------------
8 #-------------------------------------------------------------------------------
9 # Copyright (C) 2011 The IPython Development Team
9 # Copyright (C) 2011 The IPython Development Team
10 #
10 #
11 # Distributed under the terms of the BSD License. The full license is in
11 # Distributed under the terms of the BSD License. The full license is in
12 # the file COPYING, distributed as part of this software.
12 # the file COPYING, distributed as part of this software.
13 #-------------------------------------------------------------------------------
13 #-------------------------------------------------------------------------------
14
14
15 #-------------------------------------------------------------------------------
15 #-------------------------------------------------------------------------------
16 # Imports
16 # Imports
17 #-------------------------------------------------------------------------------
17 #-------------------------------------------------------------------------------
18
18
19 import sys
19 import sys
20 import platform
20 import platform
21 import time
21 import time
22 from collections import namedtuple
22 from collections import namedtuple
23 from tempfile import mktemp
23 from tempfile import mktemp
24 from StringIO import StringIO
24 from StringIO import StringIO
25
25
26 import zmq
26 import zmq
27 from nose import SkipTest
27 from nose import SkipTest
28 from nose.plugins.attrib import attr
28 from nose.plugins.attrib import attr
29
29
30 from IPython.testing import decorators as dec
30 from IPython.testing import decorators as dec
31 from IPython.testing.ipunittest import ParametricTestCase
31 from IPython.testing.ipunittest import ParametricTestCase
32 from IPython.utils.io import capture_output
32 from IPython.utils.io import capture_output
33
33
34 from IPython import parallel as pmod
34 from IPython import parallel as pmod
35 from IPython.parallel import error
35 from IPython.parallel import error
36 from IPython.parallel import AsyncResult, AsyncHubResult, AsyncMapResult
36 from IPython.parallel import AsyncResult, AsyncHubResult, AsyncMapResult
37 from IPython.parallel import DirectView
37 from IPython.parallel import DirectView
38 from IPython.parallel.util import interactive
38 from IPython.parallel.util import interactive
39
39
40 from IPython.parallel.tests import add_engines
40 from IPython.parallel.tests import add_engines
41
41
42 from .clienttest import ClusterTestCase, crash, wait, skip_without
42 from .clienttest import ClusterTestCase, crash, wait, skip_without
43
43
44 def setup():
44 def setup():
45 add_engines(3, total=True)
45 add_engines(3, total=True)
46
46
47 point = namedtuple("point", "x y")
47 point = namedtuple("point", "x y")
48
48
49 class TestView(ClusterTestCase, ParametricTestCase):
49 class TestView(ClusterTestCase, ParametricTestCase):
50
50
51 def setUp(self):
51 def setUp(self):
52 # On Win XP, wait for resource cleanup, else parallel test group fails
52 # On Win XP, wait for resource cleanup, else parallel test group fails
53 if platform.system() == "Windows" and platform.win32_ver()[0] == "XP":
53 if platform.system() == "Windows" and platform.win32_ver()[0] == "XP":
54 # 1 sec fails. 1.5 sec seems ok. Using 2 sec for margin of safety
54 # 1 sec fails. 1.5 sec seems ok. Using 2 sec for margin of safety
55 time.sleep(2)
55 time.sleep(2)
56 super(TestView, self).setUp()
56 super(TestView, self).setUp()
57
57
58 @attr('crash')
58 @attr('crash')
59 def test_z_crash_mux(self):
59 def test_z_crash_mux(self):
60 """test graceful handling of engine death (direct)"""
60 """test graceful handling of engine death (direct)"""
61 # self.add_engines(1)
61 # self.add_engines(1)
62 eid = self.client.ids[-1]
62 eid = self.client.ids[-1]
63 ar = self.client[eid].apply_async(crash)
63 ar = self.client[eid].apply_async(crash)
64 self.assertRaisesRemote(error.EngineError, ar.get, 10)
64 self.assertRaisesRemote(error.EngineError, ar.get, 10)
65 eid = ar.engine_id
65 eid = ar.engine_id
66 tic = time.time()
66 tic = time.time()
67 while eid in self.client.ids and time.time()-tic < 5:
67 while eid in self.client.ids and time.time()-tic < 5:
68 time.sleep(.01)
68 time.sleep(.01)
69 self.client.spin()
69 self.client.spin()
70 self.assertFalse(eid in self.client.ids, "Engine should have died")
70 self.assertFalse(eid in self.client.ids, "Engine should have died")
71
71
72 def test_push_pull(self):
72 def test_push_pull(self):
73 """test pushing and pulling"""
73 """test pushing and pulling"""
74 data = dict(a=10, b=1.05, c=range(10), d={'e':(1,2),'f':'hi'})
74 data = dict(a=10, b=1.05, c=range(10), d={'e':(1,2),'f':'hi'})
75 t = self.client.ids[-1]
75 t = self.client.ids[-1]
76 v = self.client[t]
76 v = self.client[t]
77 push = v.push
77 push = v.push
78 pull = v.pull
78 pull = v.pull
79 v.block=True
79 v.block=True
80 nengines = len(self.client)
80 nengines = len(self.client)
81 push({'data':data})
81 push({'data':data})
82 d = pull('data')
82 d = pull('data')
83 self.assertEqual(d, data)
83 self.assertEqual(d, data)
84 self.client[:].push({'data':data})
84 self.client[:].push({'data':data})
85 d = self.client[:].pull('data', block=True)
85 d = self.client[:].pull('data', block=True)
86 self.assertEqual(d, nengines*[data])
86 self.assertEqual(d, nengines*[data])
87 ar = push({'data':data}, block=False)
87 ar = push({'data':data}, block=False)
88 self.assertTrue(isinstance(ar, AsyncResult))
88 self.assertTrue(isinstance(ar, AsyncResult))
89 r = ar.get()
89 r = ar.get()
90 ar = self.client[:].pull('data', block=False)
90 ar = self.client[:].pull('data', block=False)
91 self.assertTrue(isinstance(ar, AsyncResult))
91 self.assertTrue(isinstance(ar, AsyncResult))
92 r = ar.get()
92 r = ar.get()
93 self.assertEqual(r, nengines*[data])
93 self.assertEqual(r, nengines*[data])
94 self.client[:].push(dict(a=10,b=20))
94 self.client[:].push(dict(a=10,b=20))
95 r = self.client[:].pull(('a','b'), block=True)
95 r = self.client[:].pull(('a','b'), block=True)
96 self.assertEqual(r, nengines*[[10,20]])
96 self.assertEqual(r, nengines*[[10,20]])
97
97
98 def test_push_pull_function(self):
98 def test_push_pull_function(self):
99 "test pushing and pulling functions"
99 "test pushing and pulling functions"
100 def testf(x):
100 def testf(x):
101 return 2.0*x
101 return 2.0*x
102
102
103 t = self.client.ids[-1]
103 t = self.client.ids[-1]
104 v = self.client[t]
104 v = self.client[t]
105 v.block=True
105 v.block=True
106 push = v.push
106 push = v.push
107 pull = v.pull
107 pull = v.pull
108 execute = v.execute
108 execute = v.execute
109 push({'testf':testf})
109 push({'testf':testf})
110 r = pull('testf')
110 r = pull('testf')
111 self.assertEqual(r(1.0), testf(1.0))
111 self.assertEqual(r(1.0), testf(1.0))
112 execute('r = testf(10)')
112 execute('r = testf(10)')
113 r = pull('r')
113 r = pull('r')
114 self.assertEqual(r, testf(10))
114 self.assertEqual(r, testf(10))
115 ar = self.client[:].push({'testf':testf}, block=False)
115 ar = self.client[:].push({'testf':testf}, block=False)
116 ar.get()
116 ar.get()
117 ar = self.client[:].pull('testf', block=False)
117 ar = self.client[:].pull('testf', block=False)
118 rlist = ar.get()
118 rlist = ar.get()
119 for r in rlist:
119 for r in rlist:
120 self.assertEqual(r(1.0), testf(1.0))
120 self.assertEqual(r(1.0), testf(1.0))
121 execute("def g(x): return x*x")
121 execute("def g(x): return x*x")
122 r = pull(('testf','g'))
122 r = pull(('testf','g'))
123 self.assertEqual((r[0](10),r[1](10)), (testf(10), 100))
123 self.assertEqual((r[0](10),r[1](10)), (testf(10), 100))
124
124
125 def test_push_function_globals(self):
125 def test_push_function_globals(self):
126 """test that pushed functions have access to globals"""
126 """test that pushed functions have access to globals"""
127 @interactive
127 @interactive
128 def geta():
128 def geta():
129 return a
129 return a
130 # self.add_engines(1)
130 # self.add_engines(1)
131 v = self.client[-1]
131 v = self.client[-1]
132 v.block=True
132 v.block=True
133 v['f'] = geta
133 v['f'] = geta
134 self.assertRaisesRemote(NameError, v.execute, 'b=f()')
134 self.assertRaisesRemote(NameError, v.execute, 'b=f()')
135 v.execute('a=5')
135 v.execute('a=5')
136 v.execute('b=f()')
136 v.execute('b=f()')
137 self.assertEqual(v['b'], 5)
137 self.assertEqual(v['b'], 5)
138
138
139 def test_push_function_defaults(self):
139 def test_push_function_defaults(self):
140 """test that pushed functions preserve default args"""
140 """test that pushed functions preserve default args"""
141 def echo(a=10):
141 def echo(a=10):
142 return a
142 return a
143 v = self.client[-1]
143 v = self.client[-1]
144 v.block=True
144 v.block=True
145 v['f'] = echo
145 v['f'] = echo
146 v.execute('b=f()')
146 v.execute('b=f()')
147 self.assertEqual(v['b'], 10)
147 self.assertEqual(v['b'], 10)
148
148
149 def test_get_result(self):
149 def test_get_result(self):
150 """test getting results from the Hub."""
150 """test getting results from the Hub."""
151 c = pmod.Client(profile='iptest')
151 c = pmod.Client(profile='iptest')
152 # self.add_engines(1)
152 # self.add_engines(1)
153 t = c.ids[-1]
153 t = c.ids[-1]
154 v = c[t]
154 v = c[t]
155 v2 = self.client[t]
155 v2 = self.client[t]
156 ar = v.apply_async(wait, 1)
156 ar = v.apply_async(wait, 1)
157 # give the monitor time to notice the message
157 # give the monitor time to notice the message
158 time.sleep(.25)
158 time.sleep(.25)
159 ahr = v2.get_result(ar.msg_ids)
159 ahr = v2.get_result(ar.msg_ids)
160 self.assertTrue(isinstance(ahr, AsyncHubResult))
160 self.assertTrue(isinstance(ahr, AsyncHubResult))
161 self.assertEqual(ahr.get(), ar.get())
161 self.assertEqual(ahr.get(), ar.get())
162 ar2 = v2.get_result(ar.msg_ids)
162 ar2 = v2.get_result(ar.msg_ids)
163 self.assertFalse(isinstance(ar2, AsyncHubResult))
163 self.assertFalse(isinstance(ar2, AsyncHubResult))
164 c.spin()
164 c.spin()
165 c.close()
165 c.close()
166
166
167 def test_run_newline(self):
167 def test_run_newline(self):
168 """test that run appends newline to files"""
168 """test that run appends newline to files"""
169 tmpfile = mktemp()
169 tmpfile = mktemp()
170 with open(tmpfile, 'w') as f:
170 with open(tmpfile, 'w') as f:
171 f.write("""def g():
171 f.write("""def g():
172 return 5
172 return 5
173 """)
173 """)
174 v = self.client[-1]
174 v = self.client[-1]
175 v.run(tmpfile, block=True)
175 v.run(tmpfile, block=True)
176 self.assertEqual(v.apply_sync(lambda f: f(), pmod.Reference('g')), 5)
176 self.assertEqual(v.apply_sync(lambda f: f(), pmod.Reference('g')), 5)
177
177
178 def test_apply_tracked(self):
178 def test_apply_tracked(self):
179 """test tracking for apply"""
179 """test tracking for apply"""
180 # self.add_engines(1)
180 # self.add_engines(1)
181 t = self.client.ids[-1]
181 t = self.client.ids[-1]
182 v = self.client[t]
182 v = self.client[t]
183 v.block=False
183 v.block=False
184 def echo(n=1024*1024, **kwargs):
184 def echo(n=1024*1024, **kwargs):
185 with v.temp_flags(**kwargs):
185 with v.temp_flags(**kwargs):
186 return v.apply(lambda x: x, 'x'*n)
186 return v.apply(lambda x: x, 'x'*n)
187 ar = echo(1, track=False)
187 ar = echo(1, track=False)
188 self.assertTrue(isinstance(ar._tracker, zmq.MessageTracker))
188 self.assertTrue(isinstance(ar._tracker, zmq.MessageTracker))
189 self.assertTrue(ar.sent)
189 self.assertTrue(ar.sent)
190 ar = echo(track=True)
190 ar = echo(track=True)
191 self.assertTrue(isinstance(ar._tracker, zmq.MessageTracker))
191 self.assertTrue(isinstance(ar._tracker, zmq.MessageTracker))
192 self.assertEqual(ar.sent, ar._tracker.done)
192 self.assertEqual(ar.sent, ar._tracker.done)
193 ar._tracker.wait()
193 ar._tracker.wait()
194 self.assertTrue(ar.sent)
194 self.assertTrue(ar.sent)
195
195
196 def test_push_tracked(self):
196 def test_push_tracked(self):
197 t = self.client.ids[-1]
197 t = self.client.ids[-1]
198 ns = dict(x='x'*1024*1024)
198 ns = dict(x='x'*1024*1024)
199 v = self.client[t]
199 v = self.client[t]
200 ar = v.push(ns, block=False, track=False)
200 ar = v.push(ns, block=False, track=False)
201 self.assertTrue(isinstance(ar._tracker, zmq.MessageTracker))
201 self.assertTrue(isinstance(ar._tracker, zmq.MessageTracker))
202 self.assertTrue(ar.sent)
202 self.assertTrue(ar.sent)
203
203
204 ar = v.push(ns, block=False, track=True)
204 ar = v.push(ns, block=False, track=True)
205 self.assertTrue(isinstance(ar._tracker, zmq.MessageTracker))
205 self.assertTrue(isinstance(ar._tracker, zmq.MessageTracker))
206 ar._tracker.wait()
206 ar._tracker.wait()
207 self.assertEqual(ar.sent, ar._tracker.done)
207 self.assertEqual(ar.sent, ar._tracker.done)
208 self.assertTrue(ar.sent)
208 self.assertTrue(ar.sent)
209 ar.get()
209 ar.get()
210
210
211 def test_scatter_tracked(self):
211 def test_scatter_tracked(self):
212 t = self.client.ids
212 t = self.client.ids
213 x='x'*1024*1024
213 x='x'*1024*1024
214 ar = self.client[t].scatter('x', x, block=False, track=False)
214 ar = self.client[t].scatter('x', x, block=False, track=False)
215 self.assertTrue(isinstance(ar._tracker, zmq.MessageTracker))
215 self.assertTrue(isinstance(ar._tracker, zmq.MessageTracker))
216 self.assertTrue(ar.sent)
216 self.assertTrue(ar.sent)
217
217
218 ar = self.client[t].scatter('x', x, block=False, track=True)
218 ar = self.client[t].scatter('x', x, block=False, track=True)
219 self.assertTrue(isinstance(ar._tracker, zmq.MessageTracker))
219 self.assertTrue(isinstance(ar._tracker, zmq.MessageTracker))
220 self.assertEqual(ar.sent, ar._tracker.done)
220 self.assertEqual(ar.sent, ar._tracker.done)
221 ar._tracker.wait()
221 ar._tracker.wait()
222 self.assertTrue(ar.sent)
222 self.assertTrue(ar.sent)
223 ar.get()
223 ar.get()
224
224
225 def test_remote_reference(self):
225 def test_remote_reference(self):
226 v = self.client[-1]
226 v = self.client[-1]
227 v['a'] = 123
227 v['a'] = 123
228 ra = pmod.Reference('a')
228 ra = pmod.Reference('a')
229 b = v.apply_sync(lambda x: x, ra)
229 b = v.apply_sync(lambda x: x, ra)
230 self.assertEqual(b, 123)
230 self.assertEqual(b, 123)
231
231
232
232
233 def test_scatter_gather(self):
233 def test_scatter_gather(self):
234 view = self.client[:]
234 view = self.client[:]
235 seq1 = range(16)
235 seq1 = range(16)
236 view.scatter('a', seq1)
236 view.scatter('a', seq1)
237 seq2 = view.gather('a', block=True)
237 seq2 = view.gather('a', block=True)
238 self.assertEqual(seq2, seq1)
238 self.assertEqual(seq2, seq1)
239 self.assertRaisesRemote(NameError, view.gather, 'asdf', block=True)
239 self.assertRaisesRemote(NameError, view.gather, 'asdf', block=True)
240
240
241 @skip_without('numpy')
241 @skip_without('numpy')
242 def test_scatter_gather_numpy(self):
242 def test_scatter_gather_numpy(self):
243 import numpy
243 import numpy
244 from numpy.testing.utils import assert_array_equal, assert_array_almost_equal
244 from numpy.testing.utils import assert_array_equal, assert_array_almost_equal
245 view = self.client[:]
245 view = self.client[:]
246 a = numpy.arange(64)
246 a = numpy.arange(64)
247 view.scatter('a', a, block=True)
247 view.scatter('a', a, block=True)
248 b = view.gather('a', block=True)
248 b = view.gather('a', block=True)
249 assert_array_equal(b, a)
249 assert_array_equal(b, a)
250
250
251 def test_scatter_gather_lazy(self):
251 def test_scatter_gather_lazy(self):
252 """scatter/gather with targets='all'"""
252 """scatter/gather with targets='all'"""
253 view = self.client.direct_view(targets='all')
253 view = self.client.direct_view(targets='all')
254 x = range(64)
254 x = range(64)
255 view.scatter('x', x)
255 view.scatter('x', x)
256 gathered = view.gather('x', block=True)
256 gathered = view.gather('x', block=True)
257 self.assertEqual(gathered, x)
257 self.assertEqual(gathered, x)
258
258
259
259
260 @dec.known_failure_py3
260 @dec.known_failure_py3
261 @skip_without('numpy')
261 @skip_without('numpy')
262 def test_push_numpy_nocopy(self):
262 def test_push_numpy_nocopy(self):
263 import numpy
263 import numpy
264 view = self.client[:]
264 view = self.client[:]
265 a = numpy.arange(64)
265 a = numpy.arange(64)
266 view['A'] = a
266 view['A'] = a
267 @interactive
267 @interactive
268 def check_writeable(x):
268 def check_writeable(x):
269 return x.flags.writeable
269 return x.flags.writeable
270
270
271 for flag in view.apply_sync(check_writeable, pmod.Reference('A')):
271 for flag in view.apply_sync(check_writeable, pmod.Reference('A')):
272 self.assertFalse(flag, "array is writeable, push shouldn't have pickled it")
272 self.assertFalse(flag, "array is writeable, push shouldn't have pickled it")
273
273
274 view.push(dict(B=a))
274 view.push(dict(B=a))
275 for flag in view.apply_sync(check_writeable, pmod.Reference('B')):
275 for flag in view.apply_sync(check_writeable, pmod.Reference('B')):
276 self.assertFalse(flag, "array is writeable, push shouldn't have pickled it")
276 self.assertFalse(flag, "array is writeable, push shouldn't have pickled it")
277
277
278 @skip_without('numpy')
278 @skip_without('numpy')
279 def test_apply_numpy(self):
279 def test_apply_numpy(self):
280 """view.apply(f, ndarray)"""
280 """view.apply(f, ndarray)"""
281 import numpy
281 import numpy
282 from numpy.testing.utils import assert_array_equal, assert_array_almost_equal
282 from numpy.testing.utils import assert_array_equal, assert_array_almost_equal
283
283
284 A = numpy.random.random((100,100))
284 A = numpy.random.random((100,100))
285 view = self.client[-1]
285 view = self.client[-1]
286 for dt in [ 'int32', 'uint8', 'float32', 'float64' ]:
286 for dt in [ 'int32', 'uint8', 'float32', 'float64' ]:
287 B = A.astype(dt)
287 B = A.astype(dt)
288 C = view.apply_sync(lambda x:x, B)
288 C = view.apply_sync(lambda x:x, B)
289 assert_array_equal(B,C)
289 assert_array_equal(B,C)
290
290
291 @skip_without('numpy')
291 @skip_without('numpy')
292 def test_push_pull_recarray(self):
292 def test_push_pull_recarray(self):
293 """push/pull recarrays"""
293 """push/pull recarrays"""
294 import numpy
294 import numpy
295 from numpy.testing.utils import assert_array_equal
295 from numpy.testing.utils import assert_array_equal
296
296
297 view = self.client[-1]
297 view = self.client[-1]
298
298
299 R = numpy.array([
299 R = numpy.array([
300 (1, 'hi', 0.),
300 (1, 'hi', 0.),
301 (2**30, 'there', 2.5),
301 (2**30, 'there', 2.5),
302 (-99999, 'world', -12345.6789),
302 (-99999, 'world', -12345.6789),
303 ], [('n', int), ('s', '|S10'), ('f', float)])
303 ], [('n', int), ('s', '|S10'), ('f', float)])
304
304
305 view['RR'] = R
305 view['RR'] = R
306 R2 = view['RR']
306 R2 = view['RR']
307
307
308 r_dtype, r_shape = view.apply_sync(interactive(lambda : (RR.dtype, RR.shape)))
308 r_dtype, r_shape = view.apply_sync(interactive(lambda : (RR.dtype, RR.shape)))
309 self.assertEqual(r_dtype, R.dtype)
309 self.assertEqual(r_dtype, R.dtype)
310 self.assertEqual(r_shape, R.shape)
310 self.assertEqual(r_shape, R.shape)
311 self.assertEqual(R2.dtype, R.dtype)
311 self.assertEqual(R2.dtype, R.dtype)
312 self.assertEqual(R2.shape, R.shape)
312 self.assertEqual(R2.shape, R.shape)
313 assert_array_equal(R2, R)
313 assert_array_equal(R2, R)
314
314
315 @skip_without('pandas')
315 @skip_without('pandas')
316 def test_push_pull_timeseries(self):
316 def test_push_pull_timeseries(self):
317 """push/pull pandas.TimeSeries"""
317 """push/pull pandas.TimeSeries"""
318 import pandas
318 import pandas
319
319
320 ts = pandas.TimeSeries(range(10))
320 ts = pandas.TimeSeries(range(10))
321
321
322 view = self.client[-1]
322 view = self.client[-1]
323
323
324 view.push(dict(ts=ts), block=True)
324 view.push(dict(ts=ts), block=True)
325 rts = view['ts']
325 rts = view['ts']
326
326
327 self.assertEqual(type(rts), type(ts))
327 self.assertEqual(type(rts), type(ts))
328 self.assertTrue((ts == rts).all())
328 self.assertTrue((ts == rts).all())
329
329
330 def test_map(self):
330 def test_map(self):
331 view = self.client[:]
331 view = self.client[:]
332 def f(x):
332 def f(x):
333 return x**2
333 return x**2
334 data = range(16)
334 data = range(16)
335 r = view.map_sync(f, data)
335 r = view.map_sync(f, data)
336 self.assertEqual(r, map(f, data))
336 self.assertEqual(r, map(f, data))
337
337
338 def test_map_iterable(self):
338 def test_map_iterable(self):
339 """test map on iterables (direct)"""
339 """test map on iterables (direct)"""
340 view = self.client[:]
340 view = self.client[:]
341 # 101 is prime, so it won't be evenly distributed
341 # 101 is prime, so it won't be evenly distributed
342 arr = range(101)
342 arr = range(101)
343 # ensure it will be an iterator, even in Python 3
343 # ensure it will be an iterator, even in Python 3
344 it = iter(arr)
344 it = iter(arr)
345 r = view.map_sync(lambda x:x, arr)
345 r = view.map_sync(lambda x:x, arr)
346 self.assertEqual(r, list(arr))
346 self.assertEqual(r, list(arr))
347
347
348 def test_scatter_gather_nonblocking(self):
348 def test_scatter_gather_nonblocking(self):
349 data = range(16)
349 data = range(16)
350 view = self.client[:]
350 view = self.client[:]
351 view.scatter('a', data, block=False)
351 view.scatter('a', data, block=False)
352 ar = view.gather('a', block=False)
352 ar = view.gather('a', block=False)
353 self.assertEqual(ar.get(), data)
353 self.assertEqual(ar.get(), data)
354
354
355 @skip_without('numpy')
355 @skip_without('numpy')
356 def test_scatter_gather_numpy_nonblocking(self):
356 def test_scatter_gather_numpy_nonblocking(self):
357 import numpy
357 import numpy
358 from numpy.testing.utils import assert_array_equal, assert_array_almost_equal
358 from numpy.testing.utils import assert_array_equal, assert_array_almost_equal
359 a = numpy.arange(64)
359 a = numpy.arange(64)
360 view = self.client[:]
360 view = self.client[:]
361 ar = view.scatter('a', a, block=False)
361 ar = view.scatter('a', a, block=False)
362 self.assertTrue(isinstance(ar, AsyncResult))
362 self.assertTrue(isinstance(ar, AsyncResult))
363 amr = view.gather('a', block=False)
363 amr = view.gather('a', block=False)
364 self.assertTrue(isinstance(amr, AsyncMapResult))
364 self.assertTrue(isinstance(amr, AsyncMapResult))
365 assert_array_equal(amr.get(), a)
365 assert_array_equal(amr.get(), a)
366
366
367 def test_execute(self):
367 def test_execute(self):
368 view = self.client[:]
368 view = self.client[:]
369 # self.client.debug=True
369 # self.client.debug=True
370 execute = view.execute
370 execute = view.execute
371 ar = execute('c=30', block=False)
371 ar = execute('c=30', block=False)
372 self.assertTrue(isinstance(ar, AsyncResult))
372 self.assertTrue(isinstance(ar, AsyncResult))
373 ar = execute('d=[0,1,2]', block=False)
373 ar = execute('d=[0,1,2]', block=False)
374 self.client.wait(ar, 1)
374 self.client.wait(ar, 1)
375 self.assertEqual(len(ar.get()), len(self.client))
375 self.assertEqual(len(ar.get()), len(self.client))
376 for c in view['c']:
376 for c in view['c']:
377 self.assertEqual(c, 30)
377 self.assertEqual(c, 30)
378
378
379 def test_abort(self):
379 def test_abort(self):
380 view = self.client[-1]
380 view = self.client[-1]
381 ar = view.execute('import time; time.sleep(1)', block=False)
381 ar = view.execute('import time; time.sleep(1)', block=False)
382 ar2 = view.apply_async(lambda : 2)
382 ar2 = view.apply_async(lambda : 2)
383 ar3 = view.apply_async(lambda : 3)
383 ar3 = view.apply_async(lambda : 3)
384 view.abort(ar2)
384 view.abort(ar2)
385 view.abort(ar3.msg_ids)
385 view.abort(ar3.msg_ids)
386 self.assertRaises(error.TaskAborted, ar2.get)
386 self.assertRaises(error.TaskAborted, ar2.get)
387 self.assertRaises(error.TaskAborted, ar3.get)
387 self.assertRaises(error.TaskAborted, ar3.get)
388
388
389 def test_abort_all(self):
389 def test_abort_all(self):
390 """view.abort() aborts all outstanding tasks"""
390 """view.abort() aborts all outstanding tasks"""
391 view = self.client[-1]
391 view = self.client[-1]
392 ars = [ view.apply_async(time.sleep, 0.25) for i in range(10) ]
392 ars = [ view.apply_async(time.sleep, 0.25) for i in range(10) ]
393 view.abort()
393 view.abort()
394 view.wait(timeout=5)
394 view.wait(timeout=5)
395 for ar in ars[5:]:
395 for ar in ars[5:]:
396 self.assertRaises(error.TaskAborted, ar.get)
396 self.assertRaises(error.TaskAborted, ar.get)
397
397
398 def test_temp_flags(self):
398 def test_temp_flags(self):
399 view = self.client[-1]
399 view = self.client[-1]
400 view.block=True
400 view.block=True
401 with view.temp_flags(block=False):
401 with view.temp_flags(block=False):
402 self.assertFalse(view.block)
402 self.assertFalse(view.block)
403 self.assertTrue(view.block)
403 self.assertTrue(view.block)
404
404
405 @dec.known_failure_py3
405 @dec.known_failure_py3
406 def test_importer(self):
406 def test_importer(self):
407 view = self.client[-1]
407 view = self.client[-1]
408 view.clear(block=True)
408 view.clear(block=True)
409 with view.importer:
409 with view.importer:
410 import re
410 import re
411
411
412 @interactive
412 @interactive
413 def findall(pat, s):
413 def findall(pat, s):
414 # this globals() step isn't necessary in real code
414 # this globals() step isn't necessary in real code
415 # only to prevent a closure in the test
415 # only to prevent a closure in the test
416 re = globals()['re']
416 re = globals()['re']
417 return re.findall(pat, s)
417 return re.findall(pat, s)
418
418
419 self.assertEqual(view.apply_sync(findall, '\w+', 'hello world'), 'hello world'.split())
419 self.assertEqual(view.apply_sync(findall, '\w+', 'hello world'), 'hello world'.split())
420
420
421 def test_unicode_execute(self):
421 def test_unicode_execute(self):
422 """test executing unicode strings"""
422 """test executing unicode strings"""
423 v = self.client[-1]
423 v = self.client[-1]
424 v.block=True
424 v.block=True
425 if sys.version_info[0] >= 3:
425 if sys.version_info[0] >= 3:
426 code="a='é'"
426 code="a='é'"
427 else:
427 else:
428 code=u"a=u'é'"
428 code=u"a=u'é'"
429 v.execute(code)
429 v.execute(code)
430 self.assertEqual(v['a'], u'é')
430 self.assertEqual(v['a'], u'é')
431
431
432 def test_unicode_apply_result(self):
432 def test_unicode_apply_result(self):
433 """test unicode apply results"""
433 """test unicode apply results"""
434 v = self.client[-1]
434 v = self.client[-1]
435 r = v.apply_sync(lambda : u'é')
435 r = v.apply_sync(lambda : u'é')
436 self.assertEqual(r, u'é')
436 self.assertEqual(r, u'é')
437
437
438 def test_unicode_apply_arg(self):
438 def test_unicode_apply_arg(self):
439 """test passing unicode arguments to apply"""
439 """test passing unicode arguments to apply"""
440 v = self.client[-1]
440 v = self.client[-1]
441
441
442 @interactive
442 @interactive
443 def check_unicode(a, check):
443 def check_unicode(a, check):
444 assert isinstance(a, unicode), "%r is not unicode"%a
444 assert isinstance(a, unicode), "%r is not unicode"%a
445 assert isinstance(check, bytes), "%r is not bytes"%check
445 assert isinstance(check, bytes), "%r is not bytes"%check
446 assert a.encode('utf8') == check, "%s != %s"%(a,check)
446 assert a.encode('utf8') == check, "%s != %s"%(a,check)
447
447
448 for s in [ u'é', u'ßø®∫',u'asdf' ]:
448 for s in [ u'é', u'ßø®∫',u'asdf' ]:
449 try:
449 try:
450 v.apply_sync(check_unicode, s, s.encode('utf8'))
450 v.apply_sync(check_unicode, s, s.encode('utf8'))
451 except error.RemoteError as e:
451 except error.RemoteError as e:
452 if e.ename == 'AssertionError':
452 if e.ename == 'AssertionError':
453 self.fail(e.evalue)
453 self.fail(e.evalue)
454 else:
454 else:
455 raise e
455 raise e
456
456
457 def test_map_reference(self):
457 def test_map_reference(self):
458 """view.map(<Reference>, *seqs) should work"""
458 """view.map(<Reference>, *seqs) should work"""
459 v = self.client[:]
459 v = self.client[:]
460 v.scatter('n', self.client.ids, flatten=True)
460 v.scatter('n', self.client.ids, flatten=True)
461 v.execute("f = lambda x,y: x*y")
461 v.execute("f = lambda x,y: x*y")
462 rf = pmod.Reference('f')
462 rf = pmod.Reference('f')
463 nlist = list(range(10))
463 nlist = list(range(10))
464 mlist = nlist[::-1]
464 mlist = nlist[::-1]
465 expected = [ m*n for m,n in zip(mlist, nlist) ]
465 expected = [ m*n for m,n in zip(mlist, nlist) ]
466 result = v.map_sync(rf, mlist, nlist)
466 result = v.map_sync(rf, mlist, nlist)
467 self.assertEqual(result, expected)
467 self.assertEqual(result, expected)
468
468
469 def test_apply_reference(self):
469 def test_apply_reference(self):
470 """view.apply(<Reference>, *args) should work"""
470 """view.apply(<Reference>, *args) should work"""
471 v = self.client[:]
471 v = self.client[:]
472 v.scatter('n', self.client.ids, flatten=True)
472 v.scatter('n', self.client.ids, flatten=True)
473 v.execute("f = lambda x: n*x")
473 v.execute("f = lambda x: n*x")
474 rf = pmod.Reference('f')
474 rf = pmod.Reference('f')
475 result = v.apply_sync(rf, 5)
475 result = v.apply_sync(rf, 5)
476 expected = [ 5*id for id in self.client.ids ]
476 expected = [ 5*id for id in self.client.ids ]
477 self.assertEqual(result, expected)
477 self.assertEqual(result, expected)
478
478
479 def test_eval_reference(self):
479 def test_eval_reference(self):
480 v = self.client[self.client.ids[0]]
480 v = self.client[self.client.ids[0]]
481 v['g'] = range(5)
481 v['g'] = range(5)
482 rg = pmod.Reference('g[0]')
482 rg = pmod.Reference('g[0]')
483 echo = lambda x:x
483 echo = lambda x:x
484 self.assertEqual(v.apply_sync(echo, rg), 0)
484 self.assertEqual(v.apply_sync(echo, rg), 0)
485
485
486 def test_reference_nameerror(self):
486 def test_reference_nameerror(self):
487 v = self.client[self.client.ids[0]]
487 v = self.client[self.client.ids[0]]
488 r = pmod.Reference('elvis_has_left')
488 r = pmod.Reference('elvis_has_left')
489 echo = lambda x:x
489 echo = lambda x:x
490 self.assertRaisesRemote(NameError, v.apply_sync, echo, r)
490 self.assertRaisesRemote(NameError, v.apply_sync, echo, r)
491
491
492 def test_single_engine_map(self):
492 def test_single_engine_map(self):
493 e0 = self.client[self.client.ids[0]]
493 e0 = self.client[self.client.ids[0]]
494 r = range(5)
494 r = range(5)
495 check = [ -1*i for i in r ]
495 check = [ -1*i for i in r ]
496 result = e0.map_sync(lambda x: -1*x, r)
496 result = e0.map_sync(lambda x: -1*x, r)
497 self.assertEqual(result, check)
497 self.assertEqual(result, check)
498
498
499 def test_len(self):
499 def test_len(self):
500 """len(view) makes sense"""
500 """len(view) makes sense"""
501 e0 = self.client[self.client.ids[0]]
501 e0 = self.client[self.client.ids[0]]
502 yield self.assertEqual(len(e0), 1)
502 yield self.assertEqual(len(e0), 1)
503 v = self.client[:]
503 v = self.client[:]
504 yield self.assertEqual(len(v), len(self.client.ids))
504 yield self.assertEqual(len(v), len(self.client.ids))
505 v = self.client.direct_view('all')
505 v = self.client.direct_view('all')
506 yield self.assertEqual(len(v), len(self.client.ids))
506 yield self.assertEqual(len(v), len(self.client.ids))
507 v = self.client[:2]
507 v = self.client[:2]
508 yield self.assertEqual(len(v), 2)
508 yield self.assertEqual(len(v), 2)
509 v = self.client[:1]
509 v = self.client[:1]
510 yield self.assertEqual(len(v), 1)
510 yield self.assertEqual(len(v), 1)
511 v = self.client.load_balanced_view()
511 v = self.client.load_balanced_view()
512 yield self.assertEqual(len(v), len(self.client.ids))
512 yield self.assertEqual(len(v), len(self.client.ids))
513 # parametric tests seem to require manual closing?
513 # parametric tests seem to require manual closing?
514 self.client.close()
514 self.client.close()
515
515
516
516
517 # begin execute tests
517 # begin execute tests
518
518
519 def test_execute_reply(self):
519 def test_execute_reply(self):
520 e0 = self.client[self.client.ids[0]]
520 e0 = self.client[self.client.ids[0]]
521 e0.block = True
521 e0.block = True
522 ar = e0.execute("5", silent=False)
522 ar = e0.execute("5", silent=False)
523 er = ar.get()
523 er = ar.get()
524 self.assertEqual(str(er), "<ExecuteReply[%i]: 5>" % er.execution_count)
524 self.assertEqual(str(er), "<ExecuteReply[%i]: 5>" % er.execution_count)
525 self.assertEqual(er.pyout['data']['text/plain'], '5')
525 self.assertEqual(er.pyout['data']['text/plain'], '5')
526
526
527 def test_execute_reply_stdout(self):
527 def test_execute_reply_stdout(self):
528 e0 = self.client[self.client.ids[0]]
528 e0 = self.client[self.client.ids[0]]
529 e0.block = True
529 e0.block = True
530 ar = e0.execute("print (5)", silent=False)
530 ar = e0.execute("print (5)", silent=False)
531 er = ar.get()
531 er = ar.get()
532 self.assertEqual(er.stdout.strip(), '5')
532 self.assertEqual(er.stdout.strip(), '5')
533
533
534 def test_execute_pyout(self):
534 def test_execute_pyout(self):
535 """execute triggers pyout with silent=False"""
535 """execute triggers pyout with silent=False"""
536 view = self.client[:]
536 view = self.client[:]
537 ar = view.execute("5", silent=False, block=True)
537 ar = view.execute("5", silent=False, block=True)
538
538
539 expected = [{'text/plain' : '5'}] * len(view)
539 expected = [{'text/plain' : '5'}] * len(view)
540 mimes = [ out['data'] for out in ar.pyout ]
540 mimes = [ out['data'] for out in ar.pyout ]
541 self.assertEqual(mimes, expected)
541 self.assertEqual(mimes, expected)
542
542
543 def test_execute_silent(self):
543 def test_execute_silent(self):
544 """execute does not trigger pyout with silent=True"""
544 """execute does not trigger pyout with silent=True"""
545 view = self.client[:]
545 view = self.client[:]
546 ar = view.execute("5", block=True)
546 ar = view.execute("5", block=True)
547 expected = [None] * len(view)
547 expected = [None] * len(view)
548 self.assertEqual(ar.pyout, expected)
548 self.assertEqual(ar.pyout, expected)
549
549
550 def test_execute_magic(self):
550 def test_execute_magic(self):
551 """execute accepts IPython commands"""
551 """execute accepts IPython commands"""
552 view = self.client[:]
552 view = self.client[:]
553 view.execute("a = 5")
553 view.execute("a = 5")
554 ar = view.execute("%whos", block=True)
554 ar = view.execute("%whos", block=True)
555 # this will raise, if that failed
555 # this will raise, if that failed
556 ar.get(5)
556 ar.get(5)
557 for stdout in ar.stdout:
557 for stdout in ar.stdout:
558 lines = stdout.splitlines()
558 lines = stdout.splitlines()
559 self.assertEqual(lines[0].split(), ['Variable', 'Type', 'Data/Info'])
559 self.assertEqual(lines[0].split(), ['Variable', 'Type', 'Data/Info'])
560 found = False
560 found = False
561 for line in lines[2:]:
561 for line in lines[2:]:
562 split = line.split()
562 split = line.split()
563 if split == ['a', 'int', '5']:
563 if split == ['a', 'int', '5']:
564 found = True
564 found = True
565 break
565 break
566 self.assertTrue(found, "whos output wrong: %s" % stdout)
566 self.assertTrue(found, "whos output wrong: %s" % stdout)
567
567
568 def test_execute_displaypub(self):
568 def test_execute_displaypub(self):
569 """execute tracks display_pub output"""
569 """execute tracks display_pub output"""
570 view = self.client[:]
570 view = self.client[:]
571 view.execute("from IPython.core.display import *")
571 view.execute("from IPython.core.display import *")
572 ar = view.execute("[ display(i) for i in range(5) ]", block=True)
572 ar = view.execute("[ display(i) for i in range(5) ]", block=True)
573
573
574 expected = [ {u'text/plain' : unicode(j)} for j in range(5) ]
574 expected = [ {u'text/plain' : unicode(j)} for j in range(5) ]
575 for outputs in ar.outputs:
575 for outputs in ar.outputs:
576 mimes = [ out['data'] for out in outputs ]
576 mimes = [ out['data'] for out in outputs ]
577 self.assertEqual(mimes, expected)
577 self.assertEqual(mimes, expected)
578
578
579 def test_apply_displaypub(self):
579 def test_apply_displaypub(self):
580 """apply tracks display_pub output"""
580 """apply tracks display_pub output"""
581 view = self.client[:]
581 view = self.client[:]
582 view.execute("from IPython.core.display import *")
582 view.execute("from IPython.core.display import *")
583
583
584 @interactive
584 @interactive
585 def publish():
585 def publish():
586 [ display(i) for i in range(5) ]
586 [ display(i) for i in range(5) ]
587
587
588 ar = view.apply_async(publish)
588 ar = view.apply_async(publish)
589 ar.get(5)
589 ar.get(5)
590 expected = [ {u'text/plain' : unicode(j)} for j in range(5) ]
590 expected = [ {u'text/plain' : unicode(j)} for j in range(5) ]
591 for outputs in ar.outputs:
591 for outputs in ar.outputs:
592 mimes = [ out['data'] for out in outputs ]
592 mimes = [ out['data'] for out in outputs ]
593 self.assertEqual(mimes, expected)
593 self.assertEqual(mimes, expected)
594
594
595 def test_execute_raises(self):
595 def test_execute_raises(self):
596 """exceptions in execute requests raise appropriately"""
596 """exceptions in execute requests raise appropriately"""
597 view = self.client[-1]
597 view = self.client[-1]
598 ar = view.execute("1/0")
598 ar = view.execute("1/0")
599 self.assertRaisesRemote(ZeroDivisionError, ar.get, 2)
599 self.assertRaisesRemote(ZeroDivisionError, ar.get, 2)
600
600
601 def test_remoteerror_render_exception(self):
601 def test_remoteerror_render_exception(self):
602 """RemoteErrors get nice tracebacks"""
602 """RemoteErrors get nice tracebacks"""
603 view = self.client[-1]
603 view = self.client[-1]
604 ar = view.execute("1/0")
604 ar = view.execute("1/0")
605 ip = get_ipython()
605 ip = get_ipython()
606 ip.user_ns['ar'] = ar
606 ip.user_ns['ar'] = ar
607 with capture_output() as io:
607 with capture_output() as io:
608 ip.run_cell("ar.get(2)")
608 ip.run_cell("ar.get(2)")
609
609
610 self.assertTrue('ZeroDivisionError' in io.stdout, io.stdout)
610 self.assertTrue('ZeroDivisionError' in io.stdout, io.stdout)
611
611
612 def test_compositeerror_render_exception(self):
612 def test_compositeerror_render_exception(self):
613 """CompositeErrors get nice tracebacks"""
613 """CompositeErrors get nice tracebacks"""
614 view = self.client[:]
614 view = self.client[:]
615 ar = view.execute("1/0")
615 ar = view.execute("1/0")
616 ip = get_ipython()
616 ip = get_ipython()
617 ip.user_ns['ar'] = ar
617 ip.user_ns['ar'] = ar
618
618 with capture_output() as io:
619 with capture_output() as io:
619 ip.run_cell("ar.get(2)")
620 ip.run_cell("ar.get(2)")
620
621
621 self.assertEqual(io.stdout.count('ZeroDivisionError'), len(view) * 2, io.stdout)
622 count = min(error.CompositeError.tb_limit, len(view))
622 self.assertEqual(io.stdout.count('by zero'), len(view), io.stdout)
623
623 self.assertEqual(io.stdout.count(':execute'), len(view), io.stdout)
624 self.assertEqual(io.stdout.count('ZeroDivisionError'), count * 2, io.stdout)
625 self.assertEqual(io.stdout.count('by zero'), count, io.stdout)
626 self.assertEqual(io.stdout.count(':execute'), count, io.stdout)
624
627
625 def test_compositeerror_truncate(self):
628 def test_compositeerror_truncate(self):
626 """Truncate CompositeErrors with many exceptions"""
629 """Truncate CompositeErrors with many exceptions"""
627 view = self.client[:]
630 view = self.client[:]
628 msg_ids = []
631 msg_ids = []
629 for i in range(10):
632 for i in range(10):
630 ar = view.execute("1/0")
633 ar = view.execute("1/0")
631 msg_ids.extend(ar.msg_ids)
634 msg_ids.extend(ar.msg_ids)
632
635
633 ar = self.client.get_result(msg_ids)
636 ar = self.client.get_result(msg_ids)
634 try:
637 try:
635 ar.get()
638 ar.get()
636 except error.CompositeError as e:
639 except error.CompositeError as e:
637 pass
640 pass
638 else:
641 else:
639 self.fail("Should have raised CompositeError")
642 self.fail("Should have raised CompositeError")
640
643
641 lines = e.render_traceback()
644 lines = e.render_traceback()
642 with capture_output() as io:
645 with capture_output() as io:
643 e.print_traceback()
646 e.print_traceback()
644
647
645 self.assertTrue("more exceptions" in lines[-1])
648 self.assertTrue("more exceptions" in lines[-1])
646 count = e.tb_limit
649 count = e.tb_limit
647
650
648 self.assertEqual(io.stdout.count('ZeroDivisionError'), 2 * count, io.stdout)
651 self.assertEqual(io.stdout.count('ZeroDivisionError'), 2 * count, io.stdout)
649 self.assertEqual(io.stdout.count('by zero'), count, io.stdout)
652 self.assertEqual(io.stdout.count('by zero'), count, io.stdout)
650 self.assertEqual(io.stdout.count(':execute'), count, io.stdout)
653 self.assertEqual(io.stdout.count(':execute'), count, io.stdout)
651
654
652 @dec.skipif_not_matplotlib
655 @dec.skipif_not_matplotlib
653 def test_magic_pylab(self):
656 def test_magic_pylab(self):
654 """%pylab works on engines"""
657 """%pylab works on engines"""
655 view = self.client[-1]
658 view = self.client[-1]
656 ar = view.execute("%pylab inline")
659 ar = view.execute("%pylab inline")
657 # at least check if this raised:
660 # at least check if this raised:
658 reply = ar.get(5)
661 reply = ar.get(5)
659 # include imports, in case user config
662 # include imports, in case user config
660 ar = view.execute("plot(rand(100))", silent=False)
663 ar = view.execute("plot(rand(100))", silent=False)
661 reply = ar.get(5)
664 reply = ar.get(5)
662 self.assertEqual(len(reply.outputs), 1)
665 self.assertEqual(len(reply.outputs), 1)
663 output = reply.outputs[0]
666 output = reply.outputs[0]
664 self.assertTrue("data" in output)
667 self.assertTrue("data" in output)
665 data = output['data']
668 data = output['data']
666 self.assertTrue("image/png" in data)
669 self.assertTrue("image/png" in data)
667
670
668 def test_func_default_func(self):
671 def test_func_default_func(self):
669 """interactively defined function as apply func default"""
672 """interactively defined function as apply func default"""
670 def foo():
673 def foo():
671 return 'foo'
674 return 'foo'
672
675
673 def bar(f=foo):
676 def bar(f=foo):
674 return f()
677 return f()
675
678
676 view = self.client[-1]
679 view = self.client[-1]
677 ar = view.apply_async(bar)
680 ar = view.apply_async(bar)
678 r = ar.get(10)
681 r = ar.get(10)
679 self.assertEqual(r, 'foo')
682 self.assertEqual(r, 'foo')
680 def test_data_pub_single(self):
683 def test_data_pub_single(self):
681 view = self.client[-1]
684 view = self.client[-1]
682 ar = view.execute('\n'.join([
685 ar = view.execute('\n'.join([
683 'from IPython.kernel.zmq.datapub import publish_data',
686 'from IPython.kernel.zmq.datapub import publish_data',
684 'for i in range(5):',
687 'for i in range(5):',
685 ' publish_data(dict(i=i))'
688 ' publish_data(dict(i=i))'
686 ]), block=False)
689 ]), block=False)
687 self.assertTrue(isinstance(ar.data, dict))
690 self.assertTrue(isinstance(ar.data, dict))
688 ar.get(5)
691 ar.get(5)
689 self.assertEqual(ar.data, dict(i=4))
692 self.assertEqual(ar.data, dict(i=4))
690
693
691 def test_data_pub(self):
694 def test_data_pub(self):
692 view = self.client[:]
695 view = self.client[:]
693 ar = view.execute('\n'.join([
696 ar = view.execute('\n'.join([
694 'from IPython.kernel.zmq.datapub import publish_data',
697 'from IPython.kernel.zmq.datapub import publish_data',
695 'for i in range(5):',
698 'for i in range(5):',
696 ' publish_data(dict(i=i))'
699 ' publish_data(dict(i=i))'
697 ]), block=False)
700 ]), block=False)
698 self.assertTrue(all(isinstance(d, dict) for d in ar.data))
701 self.assertTrue(all(isinstance(d, dict) for d in ar.data))
699 ar.get(5)
702 ar.get(5)
700 self.assertEqual(ar.data, [dict(i=4)] * len(ar))
703 self.assertEqual(ar.data, [dict(i=4)] * len(ar))
701
704
702 def test_can_list_arg(self):
705 def test_can_list_arg(self):
703 """args in lists are canned"""
706 """args in lists are canned"""
704 view = self.client[-1]
707 view = self.client[-1]
705 view['a'] = 128
708 view['a'] = 128
706 rA = pmod.Reference('a')
709 rA = pmod.Reference('a')
707 ar = view.apply_async(lambda x: x, [rA])
710 ar = view.apply_async(lambda x: x, [rA])
708 r = ar.get(5)
711 r = ar.get(5)
709 self.assertEqual(r, [128])
712 self.assertEqual(r, [128])
710
713
711 def test_can_dict_arg(self):
714 def test_can_dict_arg(self):
712 """args in dicts are canned"""
715 """args in dicts are canned"""
713 view = self.client[-1]
716 view = self.client[-1]
714 view['a'] = 128
717 view['a'] = 128
715 rA = pmod.Reference('a')
718 rA = pmod.Reference('a')
716 ar = view.apply_async(lambda x: x, dict(foo=rA))
719 ar = view.apply_async(lambda x: x, dict(foo=rA))
717 r = ar.get(5)
720 r = ar.get(5)
718 self.assertEqual(r, dict(foo=128))
721 self.assertEqual(r, dict(foo=128))
719
722
720 def test_can_list_kwarg(self):
723 def test_can_list_kwarg(self):
721 """kwargs in lists are canned"""
724 """kwargs in lists are canned"""
722 view = self.client[-1]
725 view = self.client[-1]
723 view['a'] = 128
726 view['a'] = 128
724 rA = pmod.Reference('a')
727 rA = pmod.Reference('a')
725 ar = view.apply_async(lambda x=5: x, x=[rA])
728 ar = view.apply_async(lambda x=5: x, x=[rA])
726 r = ar.get(5)
729 r = ar.get(5)
727 self.assertEqual(r, [128])
730 self.assertEqual(r, [128])
728
731
729 def test_can_dict_kwarg(self):
732 def test_can_dict_kwarg(self):
730 """kwargs in dicts are canned"""
733 """kwargs in dicts are canned"""
731 view = self.client[-1]
734 view = self.client[-1]
732 view['a'] = 128
735 view['a'] = 128
733 rA = pmod.Reference('a')
736 rA = pmod.Reference('a')
734 ar = view.apply_async(lambda x=5: x, dict(foo=rA))
737 ar = view.apply_async(lambda x=5: x, dict(foo=rA))
735 r = ar.get(5)
738 r = ar.get(5)
736 self.assertEqual(r, dict(foo=128))
739 self.assertEqual(r, dict(foo=128))
737
740
738 def test_map_ref(self):
741 def test_map_ref(self):
739 """view.map works with references"""
742 """view.map works with references"""
740 view = self.client[:]
743 view = self.client[:]
741 ranks = sorted(self.client.ids)
744 ranks = sorted(self.client.ids)
742 view.scatter('rank', ranks, flatten=True)
745 view.scatter('rank', ranks, flatten=True)
743 rrank = pmod.Reference('rank')
746 rrank = pmod.Reference('rank')
744
747
745 amr = view.map_async(lambda x: x*2, [rrank] * len(view))
748 amr = view.map_async(lambda x: x*2, [rrank] * len(view))
746 drank = amr.get(5)
749 drank = amr.get(5)
747 self.assertEqual(drank, [ r*2 for r in ranks ])
750 self.assertEqual(drank, [ r*2 for r in ranks ])
748
751
749 def test_nested_getitem_setitem(self):
752 def test_nested_getitem_setitem(self):
750 """get and set with view['a.b']"""
753 """get and set with view['a.b']"""
751 view = self.client[-1]
754 view = self.client[-1]
752 view.execute('\n'.join([
755 view.execute('\n'.join([
753 'class A(object): pass',
756 'class A(object): pass',
754 'a = A()',
757 'a = A()',
755 'a.b = 128',
758 'a.b = 128',
756 ]), block=True)
759 ]), block=True)
757 ra = pmod.Reference('a')
760 ra = pmod.Reference('a')
758
761
759 r = view.apply_sync(lambda x: x.b, ra)
762 r = view.apply_sync(lambda x: x.b, ra)
760 self.assertEqual(r, 128)
763 self.assertEqual(r, 128)
761 self.assertEqual(view['a.b'], 128)
764 self.assertEqual(view['a.b'], 128)
762
765
763 view['a.b'] = 0
766 view['a.b'] = 0
764
767
765 r = view.apply_sync(lambda x: x.b, ra)
768 r = view.apply_sync(lambda x: x.b, ra)
766 self.assertEqual(r, 0)
769 self.assertEqual(r, 0)
767 self.assertEqual(view['a.b'], 0)
770 self.assertEqual(view['a.b'], 0)
768
771
769 def test_return_namedtuple(self):
772 def test_return_namedtuple(self):
770 def namedtuplify(x, y):
773 def namedtuplify(x, y):
771 from IPython.parallel.tests.test_view import point
774 from IPython.parallel.tests.test_view import point
772 return point(x, y)
775 return point(x, y)
773
776
774 view = self.client[-1]
777 view = self.client[-1]
775 p = view.apply_sync(namedtuplify, 1, 2)
778 p = view.apply_sync(namedtuplify, 1, 2)
776 self.assertEqual(p.x, 1)
779 self.assertEqual(p.x, 1)
777 self.assertEqual(p.y, 2)
780 self.assertEqual(p.y, 2)
778
781
779 def test_apply_namedtuple(self):
782 def test_apply_namedtuple(self):
780 def echoxy(p):
783 def echoxy(p):
781 return p.y, p.x
784 return p.y, p.x
782
785
783 view = self.client[-1]
786 view = self.client[-1]
784 tup = view.apply_sync(echoxy, point(1, 2))
787 tup = view.apply_sync(echoxy, point(1, 2))
785 self.assertEqual(tup, (2,1))
788 self.assertEqual(tup, (2,1))
786
789
General Comments 0
You need to be logged in to leave comments. Login now