# 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 mojo_unittest

# pylint: disable=E0611
from mojo import system


class AsyncWaitTest(mojo_unittest.MojoTestCase):

  def setUp(self):
    super(AsyncWaitTest, self).setUp()
    self.array = []
    self.handles = system.MessagePipe()
    self.cancel = self.handles.handle0.AsyncWait(system.HANDLE_SIGNAL_READABLE,
                                                 system.DEADLINE_INDEFINITE,
                                                 self._OnResult)

  def tearDown(self):
    self.cancel()
    self.handles = None
    self.array = None
    super(AsyncWaitTest, self).tearDown()

  def _OnResult(self, value):
    self.array.append(value)

  def _WriteToHandle(self):
    self.handles.handle1.WriteMessage()

  def _PostWriteAndRun(self):
    self.loop.PostDelayedTask(self._WriteToHandle, 0)
    self.loop.RunUntilIdle()

  def testAsyncWait(self):
    self._PostWriteAndRun()
    self.assertEquals(len(self.array), 1)
    self.assertEquals(system.RESULT_OK, self.array[0])

  def testAsyncWaitCancel(self):
    self.loop.PostDelayedTask(self.cancel, 0)
    self._PostWriteAndRun()
    self.assertEquals(len(self.array), 0)

  def testAsyncWaitImmediateCancel(self):
    self.cancel()
    self._PostWriteAndRun()
    self.assertEquals(len(self.array), 0)
