blob: 8ba8531c00d3686776c609f6b292e5aa2a230fe2 [file] [log] [blame]
# 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 importlib
import unittest
from fidl_codec import ( # type: ignore[attr-defined]
decode_fidl_request,
decode_standalone,
encode_fidl_message,
method_ordinal,
)
class Importing(unittest.TestCase):
"""Fuchsia Controller FIDL Encoding Tests"""
def test_import_everything(self) -> None:
# For now import the existing fidl_codec test libraries to ensure importing functions properly.
libs = [
"test.fidlcodec.examples",
"test.fidlcodec.composedinto",
"test.fidlcodec.sys",
]
for library in libs:
fidl_library = library.replace(".", "_")
importlib.import_module("fidl." + fidl_library)
def test_construct_objects(self) -> None:
mod = importlib.import_module("fidl.test_fidlcodec_examples")
s = mod.Named(s="foobar")
self.assertEqual(s.s, "foobar")
_request = mod.FidlCodecXUnionSendAfterMigrationRequest(
u=mod.NowAsXUnion.variant_u8_type(5), i=10
)
_request2 = mod.FidlCodecTestProtocolStringRequest(s="foobar")
_request3 = mod.FidlCodecTestProtocolNullableXUnionRequest(
isu=None, i=10
)
def test_encode_union_request(self) -> None:
mod = importlib.import_module("fidl.test_fidlcodec_examples")
isu = mod.IntStructXunion()
isu.variant_tss = isu.variant_tss_type(value1="foo", value2="bar")
request = mod.FidlCodecTestProtocolNullableXUnionRequest(isu=isu, i=10)
(b, h) = encode_fidl_message(
object=request,
library="test.fidlcodec.examples",
type_name="test.fidlcodec.examples/FidlCodecTestProtocolNullableXUnionRequest",
txid=1,
ordinal=method_ordinal(
protocol="test.fidlcodec.examples/FidlCodecTestProtocol",
method="NullableXUnion",
),
)
msg = decode_fidl_request(bytes=b, handles=h)
self.assertEqual(msg["isu"]["variant_tss"]["value1"], "foo")
self.assertEqual(msg["isu"]["variant_tss"]["value2"], "bar")
self.assertEqual(msg["i"], 10)
def test_import_cross_library(self) -> None:
mod = importlib.import_module("fidl.fuchsia_controller_othertest")
other_mod = importlib.import_module("fidl.fuchsia_controller_test")
v = other_mod.NoopUnion()
v.union_str = v.union_str_type("foooberdooberdoo")
_s = mod.CrossLibraryStruct(value=v)
def test_encode_decode_enum_message(self) -> None:
mod = importlib.import_module("fidl.test_fidlcodec_examples")
req = mod.FidlCodecTestProtocolDefaultEnumMessageRequest(
ev=mod.DefaultEnum.X
)
(b, h) = encode_fidl_message(
object=req,
library="test.fidlcodec.examples",
type_name="test.fidlcodec.examples/FidlCodecTestProtocolDefaultEnumMessageRequest",
txid=1,
ordinal=method_ordinal(
protocol="test.fidlcodec.examples/FidlCodecTestProtocol",
method="DefaultEnumMessage",
),
)
msg = decode_fidl_request(bytes=b, handles=h)
self.assertEqual(msg["ev"], mod.DefaultEnum.X)
def test_alias_import_subclasses_structs(self) -> None:
mod = importlib.import_module("fidl.test_fidlcodec_examples")
alias = mod.NamedAlias
base_ty = mod.Named
self.assertTrue(issubclass(alias, base_ty))
def test_alias_type_correct_base(self) -> None:
mod = importlib.import_module("fidl.test_fidlcodec_examples")
alias = mod.StringAlias
self.assertTrue(issubclass(alias, str))
alias = mod.VectorAlias
self.assertTrue(issubclass(alias, list))
def test_alias_from_other_library_is_imported(self) -> None:
mod = importlib.import_module("fidl.test_fidlcodec_examples")
alias = mod.HandleAlias
self.assertTrue(issubclass(alias, int))
def test_possible_error_method(self) -> None:
mod = importlib.import_module("fidl.fuchsia_controller_test")
# Simply setting this should be enough of a test, as it informs that the type was
# constructed properly.
res = mod.ComposerThingReturnPossibleErrorResult()
res.err = 5
def test_protocol_classes_exist(self) -> None:
mod = importlib.import_module("fidl.fuchsia_controller_test")
self.assertEqual(mod.NoopClient, mod.Noop.Client)
self.assertEqual(mod.NoopServer, mod.Noop.Server)
self.assertEqual(mod.NoopEventHandler, mod.Noop.EventHandler)
def test_encode_protocol_return_value(self) -> None:
"""This test covers a problem area with naming protocol methods in IR.
What happens, in this test, is that if we allocate
`ComposerThing.ReturnPossibleError`, we'll have to make sure we're
encoding an object like `ComposerThingReturnPossibleError2Result`
translates FIDL IR lookup to be
`ComposerThing_ReturnPossibleError2_Result` and vice versa.
It's unclear if this test should be here or encode.py, since it's doing
both things, but it's here for now.
"""
mod = importlib.import_module("fidl.fuchsia_controller_test")
obj = mod.ComposerThingReturnPossibleError2Result()
obj.err = obj.err_type(2)
(b, h) = obj.encode()
msg = decode_standalone(
type_name=obj.__fidl_raw_type__, bytes=b, handles=h
)
self.assertEqual(msg, {"err": 2})