blob: a1b066dc93fcc159797a53c1fe85136b1bd451ad [file]
# Copyright 2023 The Fuchsia 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 unittest
from fuchsia_controller_py import (
Channel,
Context,
FcTransportStatus,
Handle,
Socket,
)
from fidl import AsyncChannel
class ChannelTests(unittest.IsolatedAsyncioTestCase):
"""Channel tests."""
def test_event_access_denied(self) -> None:
ctx = Context()
e = ctx.event_create()
with self.assertRaises(FcTransportStatus):
try:
# Attempt USER_0 signal.
e.signal_peer(0, 1 << 24)
except FcTransportStatus as e:
self.assertEqual(e.code(), FcTransportStatus.FC_ERR_FDOMAIN)
raise e
def test_eventpair_peer_closed(self) -> None:
ctx = Context()
e1, e2 = ctx.event_create_pair()
del e2
with self.assertRaises(FcTransportStatus):
try:
# Attempt USER_0 signal.
e1.signal_peer(0, 1 << 24)
except FcTransportStatus as e:
self.assertEqual(e.code(), FcTransportStatus.FC_ERR_FDOMAIN)
raise e
def test_as_int(self) -> None:
self.assertEqual(Handle(1).as_int(), 1)
self.assertEqual(Channel(2).as_int(), 2)
self.assertEqual(Socket(3).as_int(), 3)
async def test_channel_write_then_read(self) -> None:
ctx = Context()
(a, b) = ctx.channel_create()
a.write((bytearray([1, 2, 3]), []))
async_b = AsyncChannel(b)
buf, hdls = await async_b.read()
self.assertEqual(buf, bytearray([1, 2, 3]))
def test_channel_write_fails_when_closed(self) -> None:
ctx = Context()
(a, b) = ctx.channel_create()
del b
with self.assertRaises(FcTransportStatus):
try:
a.write((bytearray([1, 2, 3]), []))
except FcTransportStatus as e:
self.assertEqual(
e.args[0], FcTransportStatus.FC_ERR_CHANNEL_WRITE
)
raise e
async def test_channel_passing(self) -> None:
ctx = Context()
(a, b) = ctx.channel_create()
(c, d) = ctx.channel_create()
# This is using 'take' rather than 'as_int' as using 'as_int' would cause a double-close
# error on a channel that has already been closed.
a.write((bytearray(), [(0, c.take(), 0, 0, 0)]))
async_b = AsyncChannel(b)
_, hdls = await async_b.read()
self.assertEqual(len(hdls), 1)
new_c = Channel(hdls[0])
new_c.write((bytearray([1, 2, 3]), []))
async_d = AsyncChannel(d)
buf, d_hdls = await async_d.read()
self.assertEqual(buf, bytearray([1, 2, 3]))