• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1# Copyright 2014 The Chromium Authors. All rights reserved.
2# Use of this source code is governed by a BSD-style license that can be
3# found in the LICENSE file.
4
5import random
6import sys
7import time
8import unittest
9
10# pylint: disable=F0401
11import mojo.embedder
12from mojo import system
13
14DATA_SIZE = 1024
15
16
17def _GetRandomBuffer(size):
18  random.seed(size)
19  return bytearray(''.join(chr(random.randint(0, 255)) for i in xrange(size)))
20
21
22class BaseMojoTest(unittest.TestCase):
23
24  def setUp(self):
25    mojo.embedder.Init()
26
27
28class CoreTest(BaseMojoTest):
29
30  def testResults(self):
31    self.assertEquals(system.RESULT_OK, 0)
32    self.assertLess(system.RESULT_CANCELLED, 0)
33    self.assertLess(system.RESULT_UNKNOWN, 0)
34    self.assertLess(system.RESULT_INVALID_ARGUMENT, 0)
35    self.assertLess(system.RESULT_DEADLINE_EXCEEDED, 0)
36    self.assertLess(system.RESULT_NOT_FOUND, 0)
37    self.assertLess(system.RESULT_ALREADY_EXISTS, 0)
38    self.assertLess(system.RESULT_PERMISSION_DENIED, 0)
39    self.assertLess(system.RESULT_RESOURCE_EXHAUSTED, 0)
40    self.assertLess(system.RESULT_FAILED_PRECONDITION, 0)
41    self.assertLess(system.RESULT_ABORTED, 0)
42    self.assertLess(system.RESULT_OUT_OF_RANGE, 0)
43    self.assertLess(system.RESULT_UNIMPLEMENTED, 0)
44    self.assertLess(system.RESULT_INTERNAL, 0)
45    self.assertLess(system.RESULT_UNAVAILABLE, 0)
46    self.assertLess(system.RESULT_DATA_LOSS, 0)
47    self.assertLess(system.RESULT_BUSY, 0)
48    self.assertLess(system.RESULT_SHOULD_WAIT, 0)
49
50  def testConstants(self):
51    self.assertGreaterEqual(system.DEADLINE_INDEFINITE, 0)
52    self.assertGreaterEqual(system.HANDLE_SIGNAL_NONE, 0)
53    self.assertGreaterEqual(system.HANDLE_SIGNAL_READABLE, 0)
54    self.assertGreaterEqual(system.HANDLE_SIGNAL_WRITABLE, 0)
55    self.assertGreaterEqual(system.WRITE_MESSAGE_FLAG_NONE, 0)
56    self.assertGreaterEqual(system.READ_MESSAGE_FLAG_NONE, 0)
57    self.assertGreaterEqual(system.READ_MESSAGE_FLAG_MAY_DISCARD, 0)
58    self.assertGreaterEqual(system.WRITE_DATA_FLAG_NONE, 0)
59    self.assertGreaterEqual(system.WRITE_DATA_FLAG_ALL_OR_NONE, 0)
60    self.assertGreaterEqual(system.READ_DATA_FLAG_NONE, 0)
61    self.assertGreaterEqual(system.READ_DATA_FLAG_ALL_OR_NONE, 0)
62    self.assertGreaterEqual(system.READ_DATA_FLAG_DISCARD, 0)
63    self.assertGreaterEqual(system.READ_DATA_FLAG_QUERY, 0)
64    self.assertGreaterEqual(system.MAP_BUFFER_FLAG_NONE, 0)
65
66  def testGetTimeTicksNow(self):
67    pt1 = time.time()
68    v1 = system.GetTimeTicksNow()
69    time.sleep(1e-3)
70    v2 = system.GetTimeTicksNow()
71    pt2 = time.time()
72    self.assertGreater(v1, 0)
73    self.assertGreater(v2, v1 + 1000)
74    self.assertGreater(1e6 * (pt2 - pt1), v2 - v1)
75
76  def _testHandlesCreation(self, *args):
77    for handle in args:
78      self.assertTrue(handle.IsValid())
79      handle.Close()
80      self.assertFalse(handle.IsValid())
81
82  def _TestMessageHandleCreation(self, handles):
83    self._testHandlesCreation(handles.handle0, handles.handle1)
84
85  def testCreateMessagePipe(self):
86    self._TestMessageHandleCreation(system.MessagePipe())
87
88  def testCreateMessagePipeWithNoneOptions(self):
89    self._TestMessageHandleCreation(system.MessagePipe(None))
90
91  def testCreateMessagePipeWithOptions(self):
92    self._TestMessageHandleCreation(
93        system.MessagePipe(system.CreateMessagePipeOptions()))
94
95  def testWaitOverMessagePipe(self):
96    handles = system.MessagePipe()
97    handle = handles.handle0
98
99    self.assertEquals(system.RESULT_OK, handle.Wait(
100        system.HANDLE_SIGNAL_WRITABLE, system.DEADLINE_INDEFINITE))
101    self.assertEquals(system.RESULT_DEADLINE_EXCEEDED,
102                      handle.Wait(system.HANDLE_SIGNAL_READABLE, 0))
103
104    handles.handle1.WriteMessage()
105
106    self.assertEquals(
107        system.RESULT_OK,
108        handle.Wait(
109            system.HANDLE_SIGNAL_READABLE,
110            system.DEADLINE_INDEFINITE))
111
112  def testWaitOverManyMessagePipe(self):
113    handles = system.MessagePipe()
114    handle0 = handles.handle0
115    handle1 = handles.handle1
116
117    self.assertEquals(
118        0,
119        system.WaitMany(
120            [(handle0, system.HANDLE_SIGNAL_WRITABLE),
121             (handle1, system.HANDLE_SIGNAL_WRITABLE)],
122            system.DEADLINE_INDEFINITE))
123    self.assertEquals(
124        system.RESULT_DEADLINE_EXCEEDED,
125        system.WaitMany(
126            [(handle0, system.HANDLE_SIGNAL_READABLE),
127             (handle1, system.HANDLE_SIGNAL_READABLE)], 0))
128
129    handle0.WriteMessage()
130
131    self.assertEquals(
132        1,
133        system.WaitMany(
134            [(handle0, system.HANDLE_SIGNAL_READABLE),
135             (handle1, system.HANDLE_SIGNAL_READABLE)],
136            system.DEADLINE_INDEFINITE))
137
138  def testSendBytesOverMessagePipe(self):
139    handles = system.MessagePipe()
140    data = _GetRandomBuffer(DATA_SIZE)
141    handles.handle0.WriteMessage(data)
142    (res, buffers, next_message) = handles.handle1.ReadMessage()
143    self.assertEquals(system.RESULT_RESOURCE_EXHAUSTED, res)
144    self.assertEquals(None, buffers)
145    self.assertEquals((DATA_SIZE, 0), next_message)
146    result = bytearray(DATA_SIZE)
147    (res, buffers, next_message) = handles.handle1.ReadMessage(result)
148    self.assertEquals(system.RESULT_OK, res)
149    self.assertEquals(None, next_message)
150    self.assertEquals((data, []), buffers)
151
152  def testSendEmptyDataOverMessagePipe(self):
153    handles = system.MessagePipe()
154    handles.handle0.WriteMessage(None)
155    (res, buffers, next_message) = handles.handle1.ReadMessage()
156
157    self.assertEquals(system.RESULT_OK, res)
158    self.assertEquals(None, next_message)
159    self.assertEquals((None, []), buffers)
160
161  def testSendHandleOverMessagePipe(self):
162    handles = system.MessagePipe()
163    handles_to_send = system.MessagePipe()
164    handles.handle0.WriteMessage(handles=[handles_to_send.handle0,
165                                           handles_to_send.handle1])
166    (res, buffers, next_message) = handles.handle1.ReadMessage(
167        max_number_of_handles=2)
168
169    self.assertFalse(handles_to_send.handle0.IsValid())
170    self.assertFalse(handles_to_send.handle1.IsValid())
171    self.assertEquals(system.RESULT_OK, res)
172    self.assertEquals(None, next_message)
173    self.assertEquals(None, buffers[0])
174    self.assertEquals(2, len(buffers[1]))
175
176    handles = buffers[1]
177    for handle in handles:
178      self.assertTrue(handle.IsValid())
179      (res, buffers, next_message) = handle.ReadMessage()
180      self.assertEquals(system.RESULT_SHOULD_WAIT, res)
181
182    for handle in handles:
183      handle.WriteMessage()
184
185    for handle in handles:
186      (res, buffers, next_message) = handle.ReadMessage()
187      self.assertEquals(system.RESULT_OK, res)
188
189  def _TestDataHandleCreation(self, handles):
190    self._testHandlesCreation(
191        handles.producer_handle, handles.consumer_handle)
192
193  def testCreateDataPipe(self):
194    self._TestDataHandleCreation(system.DataPipe())
195
196  def testCreateDataPipeWithNoneOptions(self):
197    self._TestDataHandleCreation(system.DataPipe(None))
198
199  def testCreateDataPipeWithDefaultOptions(self):
200    self._TestDataHandleCreation(
201        system.DataPipe(system.CreateDataPipeOptions()))
202
203  def testCreateDataPipeWithDiscardFlag(self):
204    options = system.CreateDataPipeOptions()
205    options.flags = system.CreateDataPipeOptions.FLAG_MAY_DISCARD
206    self._TestDataHandleCreation(system.DataPipe(options))
207
208  def testCreateDataPipeWithElementSize(self):
209    options = system.CreateDataPipeOptions()
210    options.element_num_bytes = 5
211    self._TestDataHandleCreation(system.DataPipe(options))
212
213  def testCreateDataPipeWithCapacity(self):
214    options = system.CreateDataPipeOptions()
215    options.element_capacity_num_bytes = DATA_SIZE
216    self._TestDataHandleCreation(system.DataPipe(options))
217
218  def testCreateDataPipeWithIncorrectParameters(self):
219    options = system.CreateDataPipeOptions()
220    options.element_num_bytes = 5
221    options.capacity_num_bytes = DATA_SIZE
222    with self.assertRaises(system.MojoException) as cm:
223      self._TestDataHandleCreation(system.DataPipe(options))
224    self.assertEquals(system.RESULT_INVALID_ARGUMENT, cm.exception.mojo_result)
225
226  def testSendEmptyDataOverDataPipe(self):
227    pipes = system.DataPipe()
228    self.assertEquals((system.RESULT_OK, 0), pipes.producer_handle.WriteData())
229    self.assertEquals(
230        (system.RESULT_OK, None), pipes.consumer_handle.ReadData())
231
232  def testSendDataOverDataPipe(self):
233    pipes = system.DataPipe()
234    data = _GetRandomBuffer(DATA_SIZE)
235    self.assertEquals((system.RESULT_OK, DATA_SIZE),
236                      pipes.producer_handle.WriteData(data))
237    self.assertEquals((system.RESULT_OK, data),
238                      pipes.consumer_handle.ReadData(bytearray(DATA_SIZE)))
239
240  def testTwoPhaseWriteOnDataPipe(self):
241    pipes = system.DataPipe()
242    (res, buf) = pipes.producer_handle.BeginWriteData(DATA_SIZE)
243    self.assertEquals(system.RESULT_OK, res)
244    self.assertGreaterEqual(len(buf.buffer), DATA_SIZE)
245    data = _GetRandomBuffer(DATA_SIZE)
246    buf.buffer[0:DATA_SIZE] = data
247    self.assertEquals(system.RESULT_OK, buf.End(DATA_SIZE))
248    self.assertEquals((system.RESULT_OK, data),
249                      pipes.consumer_handle.ReadData(bytearray(DATA_SIZE)))
250
251  def testTwoPhaseReadOnDataPipe(self):
252    pipes = system.DataPipe()
253    data = _GetRandomBuffer(DATA_SIZE)
254    self.assertEquals((system.RESULT_OK, DATA_SIZE),
255                      pipes.producer_handle.WriteData(data))
256    (res, buf) = pipes.consumer_handle.BeginReadData()
257    self.assertEquals(system.RESULT_OK, res)
258    self.assertEquals(DATA_SIZE, len(buf.buffer))
259    self.assertEquals(data, buf.buffer)
260    self.assertEquals(system.RESULT_OK, buf.End(DATA_SIZE))
261
262  def testCreateSharedBuffer(self):
263    self._testHandlesCreation(system.CreateSharedBuffer(DATA_SIZE))
264
265  def testCreateSharedBufferWithNoneOptions(self):
266    self._testHandlesCreation(system.CreateSharedBuffer(DATA_SIZE, None))
267
268  def testCreateSharedBufferWithDefaultOptions(self):
269    self._testHandlesCreation(
270        system.CreateSharedBuffer(
271            DATA_SIZE,
272            system.CreateSharedBufferOptions()))
273
274  def testDuplicateSharedBuffer(self):
275    handle = system.CreateSharedBuffer(DATA_SIZE)
276    self._testHandlesCreation(handle.Duplicate())
277
278  def testDuplicateSharedBufferWithNoneOptions(self):
279    handle = system.CreateSharedBuffer(DATA_SIZE)
280    self._testHandlesCreation(handle.Duplicate(None))
281
282  def testDuplicateSharedBufferWithDefaultOptions(self):
283    handle = system.CreateSharedBuffer(DATA_SIZE)
284    self._testHandlesCreation(
285        handle.Duplicate(system.DuplicateSharedBufferOptions()))
286
287  def testSendBytesOverSharedBuffer(self):
288    handle = system.CreateSharedBuffer(DATA_SIZE)
289    duplicated = handle.Duplicate()
290    data = _GetRandomBuffer(DATA_SIZE)
291    (res1, buf1) = handle.Map(0, DATA_SIZE)
292    (res2, buf2) = duplicated.Map(0, DATA_SIZE)
293    self.assertEquals(system.RESULT_OK, res1)
294    self.assertEquals(system.RESULT_OK, res2)
295    self.assertEquals(DATA_SIZE, len(buf1.buffer))
296    self.assertEquals(DATA_SIZE, len(buf2.buffer))
297    self.assertEquals(buf1.buffer, buf2.buffer)
298
299    buf1.buffer[:] = data
300    self.assertEquals(data, buf1.buffer)
301    self.assertEquals(data, buf2.buffer)
302    self.assertEquals(buf1.buffer, buf2.buffer)
303
304
305if __name__ == '__main__':
306  suite = unittest.TestLoader().loadTestsFromTestCase(CoreTest)
307  test_results = unittest.TextTestRunner(verbosity=0).run(suite)
308  if not test_results.wasSuccessful():
309    sys.exit(1)
310  sys.exit(0)
311