blob: 7a3febc22286962f924d7876a2f6f20d217c162f [file] [log] [blame]
# Copyright 2014 The Chromium Authors. All rights reserved.
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.
import random
import time
import mojo_unittest
# pylint: disable=E0611
import mojo_system as system
DATA_SIZE = 1024
def _GetRandomBuffer(size):
random.seed(size)
return bytearray(''.join(chr(random.randint(0, 255)) for i in xrange(size)))
class CoreTest(mojo_unittest.MojoTestCase):
HANDLE_SIGNAL_READWRITABLE = (system.HANDLE_SIGNAL_READABLE |
system.HANDLE_SIGNAL_WRITABLE)
HANDLE_SIGNAL_ALL = (system.HANDLE_SIGNAL_READABLE |
system.HANDLE_SIGNAL_WRITABLE | system.HANDLE_SIGNAL_PEER_CLOSED)
def testResults(self):
self.assertEquals(system.RESULT_OK, 0)
self.assertGreater(system.RESULT_CANCELLED, 0)
self.assertGreater(system.RESULT_UNKNOWN, 0)
self.assertGreater(system.RESULT_INVALID_ARGUMENT, 0)
self.assertGreater(system.RESULT_DEADLINE_EXCEEDED, 0)
self.assertGreater(system.RESULT_NOT_FOUND, 0)
self.assertGreater(system.RESULT_ALREADY_EXISTS, 0)
self.assertGreater(system.RESULT_PERMISSION_DENIED, 0)
self.assertGreater(system.RESULT_RESOURCE_EXHAUSTED, 0)
self.assertGreater(system.RESULT_FAILED_PRECONDITION, 0)
self.assertGreater(system.RESULT_ABORTED, 0)
self.assertGreater(system.RESULT_OUT_OF_RANGE, 0)
self.assertGreater(system.RESULT_UNIMPLEMENTED, 0)
self.assertGreater(system.RESULT_INTERNAL, 0)
self.assertGreater(system.RESULT_UNAVAILABLE, 0)
self.assertGreater(system.RESULT_DATA_LOSS, 0)
self.assertGreater(system.RESULT_BUSY, 0)
self.assertGreater(system.RESULT_SHOULD_WAIT, 0)
def testConstants(self):
self.assertGreaterEqual(system.DEADLINE_INDEFINITE, 0)
self.assertGreaterEqual(system.HANDLE_SIGNAL_NONE, 0)
self.assertGreaterEqual(system.HANDLE_SIGNAL_READABLE, 0)
self.assertGreaterEqual(system.HANDLE_SIGNAL_WRITABLE, 0)
self.assertGreaterEqual(system.HANDLE_SIGNAL_PEER_CLOSED, 0)
self.assertGreaterEqual(system.WRITE_MESSAGE_FLAG_NONE, 0)
self.assertGreaterEqual(system.READ_MESSAGE_FLAG_NONE, 0)
self.assertGreaterEqual(system.READ_MESSAGE_FLAG_MAY_DISCARD, 0)
self.assertGreaterEqual(system.WRITE_DATA_FLAG_NONE, 0)
self.assertGreaterEqual(system.WRITE_DATA_FLAG_ALL_OR_NONE, 0)
self.assertGreaterEqual(system.READ_DATA_FLAG_NONE, 0)
self.assertGreaterEqual(system.READ_DATA_FLAG_ALL_OR_NONE, 0)
self.assertGreaterEqual(system.READ_DATA_FLAG_DISCARD, 0)
self.assertGreaterEqual(system.READ_DATA_FLAG_QUERY, 0)
self.assertGreaterEqual(system.READ_DATA_FLAG_PEEK, 0)
self.assertGreaterEqual(system.MAP_BUFFER_FLAG_NONE, 0)
def testGetTimeTicksNow(self):
v1 = system.GetTimeTicksNow()
time.sleep(1e-3)
v2 = system.GetTimeTicksNow()
self.assertGreater(v1, 0)
self.assertGreater(v2, v1 + 1e2)
self.assertLess(v2, v1 + 1e5)
def _testHandlesCreation(self, *args):
for handle in args:
self.assertTrue(handle.IsValid())
handle.Close()
self.assertFalse(handle.IsValid())
def _TestMessageHandleCreation(self, handles):
self._testHandlesCreation(handles.handle0, handles.handle1)
def testCreateMessagePipe(self):
self._TestMessageHandleCreation(system.MessagePipe())
def testCreateMessagePipeWithNoneOptions(self):
self._TestMessageHandleCreation(system.MessagePipe(None))
def testCreateMessagePipeWithOptions(self):
self._TestMessageHandleCreation(
system.MessagePipe(system.CreateMessagePipeOptions()))
def testWaitOverMessagePipe(self):
handles = system.MessagePipe()
handle = handles.handle0
(res, states) = handle.Wait(
system.HANDLE_SIGNAL_WRITABLE, system.DEADLINE_INDEFINITE)
self.assertEquals(system.RESULT_OK, res)
self.assertEquals(system.HANDLE_SIGNAL_WRITABLE, states[0])
self.assertEquals(CoreTest.HANDLE_SIGNAL_ALL, states[1])
(res, states) = handle.Wait(system.HANDLE_SIGNAL_READABLE, 0)
self.assertEquals(system.RESULT_DEADLINE_EXCEEDED, res)
self.assertEquals(system.HANDLE_SIGNAL_WRITABLE, states[0])
self.assertEquals(CoreTest.HANDLE_SIGNAL_ALL, states[1])
handles.handle1.WriteMessage()
(res, states) = handle.Wait(
system.HANDLE_SIGNAL_READABLE,
system.DEADLINE_INDEFINITE)
self.assertEquals(system.RESULT_OK, res)
self.assertEquals(CoreTest.HANDLE_SIGNAL_READWRITABLE, states[0])
self.assertEquals(CoreTest.HANDLE_SIGNAL_ALL, states[1])
def testWaitInvalidArgument(self):
(res, index, states) = system.WaitMany(
[(system.Handle(0), system.HANDLE_SIGNAL_WRITABLE),
(system.Handle(0), system.HANDLE_SIGNAL_WRITABLE)],
system.DEADLINE_INDEFINITE)
self.assertEquals(system.RESULT_INVALID_ARGUMENT, res)
self.assertEquals(0, index)
self.assertEquals(states, None)
def testWaitOverManyMessagePipe(self):
handles = system.MessagePipe()
handle0 = handles.handle0
handle1 = handles.handle1
(res, index, states) = system.WaitMany(
[(handle0, system.HANDLE_SIGNAL_WRITABLE),
(handle1, system.HANDLE_SIGNAL_WRITABLE)],
system.DEADLINE_INDEFINITE)
self.assertEquals(system.RESULT_OK, res)
self.assertEquals(0, index)
self.assertEquals(system.HANDLE_SIGNAL_WRITABLE, states[0][0])
self.assertEquals(CoreTest.HANDLE_SIGNAL_ALL, states[0][1])
self.assertEquals(system.HANDLE_SIGNAL_WRITABLE, states[1][0])
self.assertEquals(CoreTest.HANDLE_SIGNAL_ALL, states[1][1])
(res, index, states) = system.WaitMany(
[(handle0, system.HANDLE_SIGNAL_READABLE),
(handle1, system.HANDLE_SIGNAL_READABLE)], 0)
self.assertEquals(system.RESULT_DEADLINE_EXCEEDED, res)
self.assertEquals(None, index)
self.assertEquals(system.HANDLE_SIGNAL_WRITABLE, states[0][0])
self.assertEquals(CoreTest.HANDLE_SIGNAL_ALL, states[0][1])
self.assertEquals(system.HANDLE_SIGNAL_WRITABLE, states[1][0])
self.assertEquals(CoreTest.HANDLE_SIGNAL_ALL, states[1][1])
handle0.WriteMessage()
(res, index, states) = system.WaitMany(
[(handle0, system.HANDLE_SIGNAL_READABLE),
(handle1, system.HANDLE_SIGNAL_READABLE)],
system.DEADLINE_INDEFINITE)
self.assertEquals(system.RESULT_OK, res)
self.assertEquals(1, index)
self.assertEquals(system.HANDLE_SIGNAL_WRITABLE, states[0][0])
self.assertEquals(CoreTest.HANDLE_SIGNAL_ALL, states[0][1])
self.assertEquals(CoreTest.HANDLE_SIGNAL_READWRITABLE, states[1][0])
self.assertEquals(CoreTest.HANDLE_SIGNAL_ALL, states[1][1])
def testSendBytesOverMessagePipe(self):
handles = system.MessagePipe()
data = _GetRandomBuffer(DATA_SIZE)
handles.handle0.WriteMessage(data)
(res, buffers, next_message) = handles.handle1.ReadMessage()
self.assertEquals(system.RESULT_RESOURCE_EXHAUSTED, res)
self.assertEquals(None, buffers)
self.assertEquals((DATA_SIZE, 0), next_message)
result = bytearray(DATA_SIZE)
(res, buffers, next_message) = handles.handle1.ReadMessage(result)
self.assertEquals(system.RESULT_OK, res)
self.assertEquals(None, next_message)
self.assertEquals((data, []), buffers)
def testSendEmptyDataOverMessagePipe(self):
handles = system.MessagePipe()
handles.handle0.WriteMessage(None)
(res, buffers, next_message) = handles.handle1.ReadMessage()
self.assertEquals(system.RESULT_OK, res)
self.assertEquals(None, next_message)
self.assertEquals((None, []), buffers)
def testSendHandleOverMessagePipe(self):
handles = system.MessagePipe()
handles_to_send = system.MessagePipe()
handles.handle0.WriteMessage(handles=[handles_to_send.handle0,
handles_to_send.handle1])
(res, buffers, next_message) = handles.handle1.ReadMessage(
max_number_of_handles=2)
self.assertFalse(handles_to_send.handle0.IsValid())
self.assertFalse(handles_to_send.handle1.IsValid())
self.assertEquals(system.RESULT_OK, res)
self.assertEquals(None, next_message)
self.assertEquals(None, buffers[0])
self.assertEquals(2, len(buffers[1]))
handles = buffers[1]
for handle in handles:
self.assertTrue(handle.IsValid())
(res, buffers, next_message) = handle.ReadMessage()
self.assertEquals(system.RESULT_SHOULD_WAIT, res)
for handle in handles:
handle.WriteMessage()
for handle in handles:
(res, buffers, next_message) = handle.ReadMessage()
self.assertEquals(system.RESULT_OK, res)
def _TestDataHandleCreation(self, handles):
self._testHandlesCreation(
handles.producer_handle, handles.consumer_handle)
def testCreateDataPipe(self):
self._TestDataHandleCreation(system.DataPipe())
def testCreateDataPipeWithNoneOptions(self):
self._TestDataHandleCreation(system.DataPipe(None))
def testCreateDataPipeWithDefaultOptions(self):
self._TestDataHandleCreation(
system.DataPipe(system.CreateDataPipeOptions()))
def testCreateDataPipeWithElementSize(self):
options = system.CreateDataPipeOptions()
options.element_num_bytes = 5
self._TestDataHandleCreation(system.DataPipe(options))
def testCreateDataPipeWithCapacity(self):
options = system.CreateDataPipeOptions()
options.element_capacity_num_bytes = DATA_SIZE
self._TestDataHandleCreation(system.DataPipe(options))
def testCreateDataPipeWithIncorrectParameters(self):
options = system.CreateDataPipeOptions()
options.element_num_bytes = 5
options.capacity_num_bytes = DATA_SIZE
with self.assertRaises(system.MojoException) as cm:
self._TestDataHandleCreation(system.DataPipe(options))
self.assertEquals(system.RESULT_INVALID_ARGUMENT, cm.exception.mojo_result)
def testSendEmptyDataOverDataPipe(self):
pipes = system.DataPipe()
self.assertEquals((system.RESULT_OK, 0), pipes.producer_handle.WriteData())
self.assertEquals(
(system.RESULT_OK, None), pipes.consumer_handle.ReadData())
def testSendDataOverDataPipe(self):
pipes = system.DataPipe()
data = _GetRandomBuffer(DATA_SIZE)
self.assertEquals((system.RESULT_OK, DATA_SIZE),
pipes.producer_handle.WriteData(data))
self.assertEquals((system.RESULT_OK, data),
pipes.consumer_handle.ReadData(
bytearray(DATA_SIZE), system.READ_DATA_FLAG_PEEK))
self.assertEquals((system.RESULT_OK, data),
pipes.consumer_handle.ReadData(bytearray(DATA_SIZE)))
def testTwoPhaseWriteOnDataPipe(self):
pipes = system.DataPipe()
(res, buf) = pipes.producer_handle.BeginWriteData(DATA_SIZE)
self.assertEquals(system.RESULT_OK, res)
self.assertGreaterEqual(len(buf.buffer), DATA_SIZE)
data = _GetRandomBuffer(DATA_SIZE)
buf.buffer[0:DATA_SIZE] = data
self.assertEquals(system.RESULT_OK, buf.End(DATA_SIZE))
self.assertEquals((system.RESULT_OK, data),
pipes.consumer_handle.ReadData(bytearray(DATA_SIZE)))
def testTwoPhaseReadOnDataPipe(self):
pipes = system.DataPipe()
data = _GetRandomBuffer(DATA_SIZE)
self.assertEquals((system.RESULT_OK, DATA_SIZE),
pipes.producer_handle.WriteData(data))
(res, buf) = pipes.consumer_handle.BeginReadData()
self.assertEquals(system.RESULT_OK, res)
self.assertEquals(DATA_SIZE, len(buf.buffer))
self.assertEquals(data, buf.buffer)
self.assertEquals(system.RESULT_OK, buf.End(DATA_SIZE))
def testCreateSharedBuffer(self):
self._testHandlesCreation(system.CreateSharedBuffer(DATA_SIZE))
def testCreateSharedBufferWithNoneOptions(self):
self._testHandlesCreation(system.CreateSharedBuffer(DATA_SIZE, None))
def testCreateSharedBufferWithDefaultOptions(self):
self._testHandlesCreation(
system.CreateSharedBuffer(
DATA_SIZE,
system.CreateSharedBufferOptions()))
def testDuplicateSharedBuffer(self):
handle = system.CreateSharedBuffer(DATA_SIZE)
self._testHandlesCreation(handle.Duplicate())
def testDuplicateSharedBufferWithNoneOptions(self):
handle = system.CreateSharedBuffer(DATA_SIZE)
self._testHandlesCreation(handle.Duplicate(None))
def testDuplicateSharedBufferWithDefaultOptions(self):
handle = system.CreateSharedBuffer(DATA_SIZE)
self._testHandlesCreation(
handle.Duplicate(system.DuplicateSharedBufferOptions()))
def testSendBytesOverSharedBuffer(self):
handle = system.CreateSharedBuffer(DATA_SIZE)
duplicated = handle.Duplicate()
data = _GetRandomBuffer(DATA_SIZE)
(res1, buf1) = handle.Map(0, DATA_SIZE)
(res2, buf2) = duplicated.Map(0, DATA_SIZE)
self.assertEquals(system.RESULT_OK, res1)
self.assertEquals(system.RESULT_OK, res2)
self.assertEquals(DATA_SIZE, len(buf1.buffer))
self.assertEquals(DATA_SIZE, len(buf2.buffer))
self.assertEquals(buf1.buffer, buf2.buffer)
buf1.buffer[:] = data
self.assertEquals(data, buf1.buffer)
self.assertEquals(data, buf2.buffer)
self.assertEquals(buf1.buffer, buf2.buffer)