diff --git a/tests/test_cloudevent/test_datamodel/test_ucloudevent.py b/tests/test_cloudevent/test_datamodel/test_ucloudevent.py
new file mode 100644
index 0000000..29201c5
--- /dev/null
+++ b/tests/test_cloudevent/test_datamodel/test_ucloudevent.py
@@ -0,0 +1,278 @@
+# -------------------------------------------------------------------------
+#
+# Copyright (c) 2023 General Motors GTO LLC
+#
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements. See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership. The ASF licenses this file
+# to you under the Apache License, Version 2.0 (the
+# "License") you may not use this file except in compliance
+# with the License. You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing,
+# software distributed under the License is distributed on an
+# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+# KIND, either express or implied. See the License for the
+# specific language governing permissions and limitations
+# under the License.
+# SPDX-FileType: SOURCE
+# SPDX-FileCopyrightText: 2023 General Motors GTO LLC
+# SPDX-License-Identifier: Apache-2.0
+#
+# -------------------------------------------------------------------------
+
+from uprotocol.proto.uri_pb2 import UUri, UEntity, UResource
+from uprotocol.uri.serializer.longuriserializer import LongUriSerializer
+from uprotocol.proto.cloudevents_pb2 import CloudEvent
+from uprotocol.proto.uattributes_pb2 import UMessageType, UPriority
+from uprotocol.cloudevent.factory.cloudeventfactory import CloudEventFactory
+from uprotocol.proto.ustatus_pb2 import UCode
+from uprotocol.uuid.factory.uuidfactory import Factories
+from uprotocol.uuid.serializer.longuuidserializer import LongUuidSerializer
+import time
+import unittest
+
+from google.protobuf import any_pb2
+
+from uprotocol.cloudevent.datamodel.ucloudeventattributes import UCloudEventAttributesBuilder
+from uprotocol.cloudevent.factory.ucloudevent import UCloudEvent
+
+def build_uri_for_test():
+ uri = UUri(entity=UEntity(name="body.access"),
+ resource=UResource(name="door", instance="front_left", message="Door"))
+ return LongUriSerializer().serialize(uri)
+
+
+def build_proto_payload_for_test():
+ ce_proto = CloudEvent(spec_version="1.0", source="//VCU.MY_CAR_VIN/body.access//door.front_left#Door", id="hello",
+ type="example.demo",
+ proto_data=any_pb2.Any())
+
+ any_obj = any_pb2.Any()
+ any_obj.Pack(ce_proto)
+ return any_obj
+
+
+def build_cloud_event_for_test():
+ source = build_uri_for_test()
+ proto_payload = build_proto_payload_for_test()
+ # additional attributes
+ u_cloud_event_attributes = UCloudEventAttributesBuilder().with_hash("somehash").with_priority(
+ UPriority.UPRIORITY_CS1).with_ttl(3).with_token("someOAuthToken").build()
+
+ # build the cloud event
+ cloud_event = CloudEventFactory.build_base_cloud_event("testme", source, proto_payload.SerializeToString(),
+ proto_payload.type_url, u_cloud_event_attributes,
+ UCloudEvent.get_event_type(
+ UMessageType.UMESSAGE_TYPE_PUBLISH))
+ return cloud_event
+
+
+class TestUCloudEvent(unittest.TestCase):
+ DATA_CONTENT_TYPE = "application/x-protobuf"
+
+ def test_extract_source_from_cloudevent(self):
+ cloud_event = build_cloud_event_for_test()
+ source = UCloudEvent.get_source(cloud_event)
+ self.assertEquals("/body.access//door.front_left#Door", source)
+
+ def test_extract_sink_from_cloudevent_when_sink_exists(self):
+ sink = "//bo.cloud/petapp/1/rpc.response"
+ cloud_event = build_cloud_event_for_test()
+ cloud_event.__setitem__("sink", sink)
+ self.assertEquals(sink, UCloudEvent.get_sink(cloud_event))
+
+ def test_extract_sink_from_cloudevent_when_sink_does_not_exist(self):
+ cloud_event = build_cloud_event_for_test()
+ self.assertEquals(None, UCloudEvent.get_sink(cloud_event))
+
+ def test_extract_requestId_from_cloudevent_when_requestId_exists(self):
+ cloud_event = build_cloud_event_for_test()
+ cloud_event.__setitem__("reqid", "somereqid")
+ self.assertEquals("somereqid", UCloudEvent.get_request_id(cloud_event))
+
+ def test_extract_requestId_from_cloudevent_when_requestId_does_not_exist(self):
+ cloud_event = build_cloud_event_for_test()
+ self.assertEquals(None, UCloudEvent.get_request_id(cloud_event))
+
+ def test_extract_requestId_from_cloudevent_when_requestId_value_is_null(self):
+ cloud_event = build_cloud_event_for_test()
+ cloud_event.__setitem__("reqid", None)
+ self.assertEquals(None, UCloudEvent.get_request_id(cloud_event))
+
+ def test_extract_hash_from_cloudevent_when_hash_exists(self):
+ cloud_event = build_cloud_event_for_test()
+ self.assertEquals("somehash", UCloudEvent.get_hash(cloud_event))
+
+ def test_extract_hash_from_cloudevent_when_hash_does_not_exist(self):
+ cloud_event = build_cloud_event_for_test()
+ cloud_event.__delitem__("hash")
+ self.assertEquals(None, UCloudEvent.get_hash(cloud_event))
+
+ def test_extract_priority_from_cloudevent_when_priority_exists(self):
+ cloud_event = build_cloud_event_for_test()
+ self.assertEquals(UPriority.Name(UPriority.UPRIORITY_CS1), UCloudEvent.get_priority(cloud_event))
+
+ def test_extract_priority_from_cloudevent_when_priority_does_not_exist(self):
+ cloud_event = build_cloud_event_for_test()
+ cloud_event.__delitem__("priority")
+ self.assertEquals(None, UCloudEvent.get_priority(cloud_event))
+
+ def test_extract_ttl_from_cloudevent_when_ttl_exists(self):
+ cloud_event = build_cloud_event_for_test()
+ self.assertEquals(3, UCloudEvent.get_ttl(cloud_event))
+
+ def test_extract_ttl_from_cloudevent_when_ttl_does_not_exists(self):
+ cloud_event = build_cloud_event_for_test()
+ cloud_event.__delitem__("ttl")
+ self.assertEquals(None, UCloudEvent.get_ttl(cloud_event))
+
+ def test_extract_token_from_cloudevent_when_token_exists(self):
+ cloud_event = build_cloud_event_for_test()
+ self.assertEquals("someOAuthToken", UCloudEvent.get_token(cloud_event))
+
+ def test_extract_token_from_cloudevent_when_token_does_not_exists(self):
+ cloud_event = build_cloud_event_for_test()
+ cloud_event.__delitem__("token")
+ self.assertEquals(None, UCloudEvent.get_token(cloud_event))
+
+ def test_cloudevent_has_platform_error_when_platform_error_exists(self):
+ cloud_event = build_cloud_event_for_test()
+ cloud_event.__setitem__("commstatus", UCode.ABORTED)
+ self.assertEquals(10, UCloudEvent.get_communication_status(cloud_event))
+
+ def test_cloudevent_has_platform_error_when_platform_error_does_not_exist(self):
+ cloud_event = build_cloud_event_for_test()
+ self.assertEquals(UCode.OK, UCloudEvent.get_communication_status(cloud_event))
+
+ def test_extract_platform_error_from_cloudevent_when_platform_error_exists_in_wrong_format(self):
+ cloud_event = build_cloud_event_for_test()
+ cloud_event.__setitem__("commstatus", "boom")
+ self.assertEquals(UCode.OK, UCloudEvent.get_communication_status(cloud_event))
+
+ def test_cloudevent_is_not_expired_cd_when_no_ttl_configured(self):
+ cloud_event = build_cloud_event_for_test()
+ cloud_event.__delitem__("ttl")
+ self.assertFalse(UCloudEvent.is_expired_by_cloud_event_creation_date(cloud_event))
+
+ def test_cloudevent_is_not_expired_cd_when_ttl_is_zero(self):
+ cloud_event = build_cloud_event_for_test()
+ cloud_event.__setitem__("ttl", 0)
+ self.assertFalse(UCloudEvent.is_expired_by_cloud_event_creation_date(cloud_event))
+
+ def test_cloudevent_is_not_expired_cd_when_ttl_is_minus_one(self):
+ cloud_event = build_cloud_event_for_test()
+ cloud_event.__setitem__("ttl", -1)
+ self.assertFalse(UCloudEvent.is_expired_by_cloud_event_creation_date(cloud_event))
+
+ def test_cloudevent_is_expired_when_ttl_1_mili(self):
+ uuid = Factories.UPROTOCOL.create()
+ str_uuid = LongUuidSerializer.instance().serialize(uuid)
+ cloud_event = build_cloud_event_for_test()
+ cloud_event.__setitem__("ttl", 1)
+ cloud_event.__setitem__('id', str_uuid)
+ time.sleep(8)
+ self.assertTrue(UCloudEvent.is_expired(cloud_event))
+
+ def test_cloudevent_is_expired_for_invalid_uuid(self):
+ uuid = Factories.UPROTOCOL.create()
+ cloud_event = build_cloud_event_for_test()
+ cloud_event.__setitem__("ttl", 50000)
+ cloud_event.__setitem__('id', "")
+ self.assertFalse(UCloudEvent.is_expired(cloud_event))
+
+ def test_cloudevent_has_a_UUIDV8_id(self):
+ uuid = Factories.UPROTOCOL.create()
+ str_uuid = LongUuidSerializer.instance().serialize(uuid)
+ cloud_event = build_cloud_event_for_test()
+ cloud_event.__setitem__('id', str_uuid)
+ self.assertTrue(UCloudEvent.is_cloud_event_id(cloud_event))
+
+ def test_to_message_with_valid_event(self):
+ # additional attributes
+ u_cloud_event_attributes = UCloudEventAttributesBuilder().with_priority(
+ UPriority.UPRIORITY_CS2).with_ttl(3).build()
+ cloud_event = CloudEventFactory.publish(build_uri_for_test(), build_proto_payload_for_test(),
+ u_cloud_event_attributes)
+ u_message = UCloudEvent.toMessage(cloud_event)
+ self.assertIsNotNone(u_message)
+
+ def test_from_message_with_valid_message(self):
+ # additional attributes
+ u_cloud_event_attributes = UCloudEventAttributesBuilder().with_priority(
+ UPriority.UPRIORITY_CS2).with_ttl(3).build()
+ cloud_event = CloudEventFactory.publish(build_uri_for_test(), build_proto_payload_for_test(),
+ u_cloud_event_attributes)
+ u_message = UCloudEvent.toMessage(cloud_event)
+ self.assertIsNotNone(u_message)
+ cloud_event1 = UCloudEvent.fromMessage(u_message)
+ self.assertIsNotNone(cloud_event1)
+ self.assertEquals(cloud_event, cloud_event1)
+ self.assertEquals(cloud_event.get_data(), cloud_event1.get_data())
+ self.assertEquals(UCloudEvent.get_source(cloud_event), UCloudEvent.get_source(cloud_event1))
+ self.assertEquals(UCloudEvent.get_specversion(cloud_event), UCloudEvent.get_specversion(cloud_event1))
+ self.assertEquals(UCloudEvent.get_priority(cloud_event), UCloudEvent.get_priority(cloud_event1))
+ self.assertEquals(UCloudEvent.get_id(cloud_event), UCloudEvent.get_id(cloud_event1))
+ self.assertEquals(UCloudEvent.get_type(cloud_event), UCloudEvent.get_type(cloud_event1))
+
+ def test_to_from_message_from_request_cloudevent(self):
+ # additional attributes
+ u_cloud_event_attributes = UCloudEventAttributesBuilder().with_priority(
+ UPriority.UPRIORITY_CS2).with_ttl(3).with_token("someOAuthToken").build()
+
+ cloud_event = CloudEventFactory.request(build_uri_for_test(), "//bo.cloud/petapp/1/rpc.response",
+ CloudEventFactory.generate_cloud_event_id(),
+ build_proto_payload_for_test(),
+ u_cloud_event_attributes)
+ result = UCloudEvent.toMessage(cloud_event)
+ self.assertIsNotNone(result)
+ self.assertEquals(UCloudEvent.get_ttl(cloud_event), result.attributes.ttl)
+ self.assertEquals(UCloudEvent.get_token(cloud_event), result.attributes.token)
+ self.assertEquals(UCloudEvent.get_sink(cloud_event),
+ LongUriSerializer().serialize(result.attributes.sink))
+ self.assertEquals(UCloudEvent.get_payload(cloud_event).SerializeToString(), result.payload.value)
+ self.assertEquals(UCloudEvent.get_source(cloud_event),
+ LongUriSerializer().serialize(result.source))
+ self.assertEquals(UCloudEvent.get_priority(cloud_event),
+ UPriority.Name(result.attributes.priority))
+
+ cloud_event1 = UCloudEvent.fromMessage(result)
+ self.assertEquals(cloud_event, cloud_event1)
+ self.assertEquals(cloud_event.get_data(), cloud_event1.get_data())
+ self.assertEquals(UCloudEvent.get_source(cloud_event), UCloudEvent.get_source(cloud_event1))
+ self.assertEquals(UCloudEvent.get_sink(cloud_event), UCloudEvent.get_sink(cloud_event1))
+ self.assertEquals(UCloudEvent.get_specversion(cloud_event), UCloudEvent.get_specversion(cloud_event1))
+ self.assertEquals(UCloudEvent.get_priority(cloud_event), UCloudEvent.get_priority(cloud_event1))
+ self.assertEquals(UCloudEvent.get_id(cloud_event), UCloudEvent.get_id(cloud_event1))
+ self.assertEquals(UCloudEvent.get_type(cloud_event), UCloudEvent.get_type(cloud_event1))
+ self.assertEquals(UCloudEvent.get_request_id(cloud_event), UCloudEvent.get_request_id(cloud_event1))
+
+ def test_to_from_message_from_request_cloudevent_without_attributes(self):
+ # additional attributes
+ u_cloud_event_attributes = UCloudEventAttributesBuilder().build()
+
+ cloud_event = CloudEventFactory.request(build_uri_for_test(), "//bo.cloud/petapp/1/rpc.response",
+ CloudEventFactory.generate_cloud_event_id(),
+ build_proto_payload_for_test(),
+ u_cloud_event_attributes)
+ result = UCloudEvent.toMessage(cloud_event)
+ self.assertIsNotNone(result)
+ self.assertFalse(result.attributes.HasField('ttl'))
+ self.assertEquals(UCloudEvent.get_sink(cloud_event),
+ LongUriSerializer().serialize(result.attributes.sink))
+ self.assertEquals(UCloudEvent.get_payload(cloud_event).SerializeToString(), result.payload.value)
+ self.assertEquals(UCloudEvent.get_source(cloud_event), LongUriSerializer().serialize(result.source))
+ self.assertEquals(result.attributes.priority, 0)
+
+ cloud_event1 = UCloudEvent.fromMessage(result)
+ self.assertEquals(cloud_event.get_data(), cloud_event1.get_data())
+ self.assertEquals(UCloudEvent.get_source(cloud_event),UCloudEvent.get_source(cloud_event1))
+ self.assertEquals(UCloudEvent.get_sink(cloud_event),UCloudEvent.get_sink(cloud_event1))
+ self.assertEquals(UCloudEvent.get_specversion(cloud_event),UCloudEvent.get_specversion(cloud_event1))
+ self.assertEquals(UCloudEvent.get_priority(cloud_event),UCloudEvent.get_priority(cloud_event1))
+ self.assertEquals(UCloudEvent.get_id(cloud_event),UCloudEvent.get_id(cloud_event1))
+ self.assertEquals(UCloudEvent.get_type(cloud_event),UCloudEvent.get_type(cloud_event1))
+ self.assertEquals(UCloudEvent.get_request_id(cloud_event),UCloudEvent.get_request_id(cloud_event1))
diff --git a/uprotocol/cloudevent/factory/ucloudevent.py b/uprotocol/cloudevent/factory/ucloudevent.py
index c85ff02..a6ca1ce 100644
--- a/uprotocol/cloudevent/factory/ucloudevent.py
+++ b/uprotocol/cloudevent/factory/ucloudevent.py
@@ -1,5 +1,5 @@
# -------------------------------------------------------------------------
-
+import time
# Copyright (c) 2023 General Motors GTO LLC
#
# Licensed to the Apache Software Foundation (ASF) under one
@@ -30,10 +30,15 @@
from cloudevents.http import CloudEvent
from google.protobuf import any_pb2
from google.protobuf.message import DecodeError
+
from uprotocol.proto.ustatus_pb2 import UCode
-from uprotocol.proto.uattributes_pb2 import UMessageType
+from uprotocol.proto.uattributes_pb2 import UMessageType, UPriority, UAttributes
+from uprotocol.uri.serializer.longuriserializer import LongUriSerializer
from uprotocol.uuid.factory.uuidutils import UUIDUtils
from uprotocol.uuid.serializer.longuuidserializer import LongUuidSerializer
+from uprotocol.proto.upayload_pb2 import UPayloadFormat, UPayload
+from uprotocol.proto.umessage_pb2 import UMessage
+from uprotocol.proto.uuid_pb2 import UUID
class UCloudEvent:
@@ -173,8 +178,11 @@ def get_communication_status(ce: CloudEvent) -> int:
@return: Returns a {@link UCode} value that indicates of a platform communication error while delivering this
CloudEvent or UCode.OK_VALUE.
"""
- comm_status = UCloudEvent.extract_string_value_from_attributes("commstatus", ce)
- return int(comm_status) if comm_status is not None else UCode.OK
+ try:
+ comm_status = UCloudEvent.extract_string_value_from_attributes("commstatus", ce)
+ return int(comm_status) if comm_status is not None else UCode.OK
+ except:
+ return UCode.OK
@staticmethod
def has_communication_status_problem(ce: CloudEvent) -> bool:
@@ -183,7 +191,7 @@ def has_communication_status_problem(ce: CloudEvent) -> bool:
@param ce:CloudEvent to be queried for a platform delivery error.
@return:returns true if the provided CloudEvent is marked with having a platform delivery problem.
"""
- return UCloudEvent.get_communication_status(ce) != 0
+ return UCloudEvent.get_communication_status(ce) != UCode.OK
@staticmethod
def add_communication_status(ce: CloudEvent, communication_status) -> CloudEvent:
@@ -247,9 +255,9 @@ def is_expired(ce: CloudEvent) -> bool:
try:
uuid = LongUuidSerializer.instance().deserialize(cloud_event_id)
- if uuid is None:
+ if uuid is None or uuid == UUID():
return False
- delta = datetime.utcnow().timestamp() - UUIDUtils.getTime(uuid)
+ delta = int(round(time.time() * 1000)) - UUIDUtils.getTime(uuid)
except ValueError:
# Invalid UUID, handle accordingly
delta = 0
@@ -295,7 +303,7 @@ def unpack(ce: CloudEvent, clazz):
@return: Returns a {@link Message} payload of the class type that is provided.
"""
try:
- any_obj=UCloudEvent.get_payload(ce)
+ any_obj = UCloudEvent.get_payload(ce)
value = clazz()
value.ParseFromString(any_obj.value)
return value
@@ -349,9 +357,126 @@ def extract_integer_value_from_attributes(attr_name, ce: CloudEvent) -> int:
@staticmethod
def get_event_type(type):
return {UMessageType.UMESSAGE_TYPE_PUBLISH: "pub.v1", UMessageType.UMESSAGE_TYPE_REQUEST: "req.v1",
- UMessageType.UMESSAGE_TYPE_RESPONSE: "res.v1"}.get(type, "")
+ UMessageType.UMESSAGE_TYPE_RESPONSE: "res.v1"}.get(type, "")
@staticmethod
def get_message_type(ce_type):
return {"pub.v1": UMessageType.UMESSAGE_TYPE_PUBLISH, "req.v1": UMessageType.UMESSAGE_TYPE_REQUEST,
- "res.v1": UMessageType.UMESSAGE_TYPE_RESPONSE}.get(ce_type, UMessageType.UMESSAGE_TYPE_UNSPECIFIED)
+ "res.v1": UMessageType.UMESSAGE_TYPE_RESPONSE}.get(ce_type, UMessageType.UMESSAGE_TYPE_UNSPECIFIED)
+
+ @staticmethod
+ def get_content_type_from_upayload_format(payload_format: UPayloadFormat):
+ """
+ Retrieves the content type string based on the provided UPayloadFormat enumeration.
+ @param payload_format The UPayloadFormat enumeration representing the payload format.
+ @return The corresponding content type string based on the payload format.
+ """
+ return {
+ UPayloadFormat.UPAYLOAD_FORMAT_JSON: "application/json",
+ UPayloadFormat.UPAYLOAD_FORMAT_RAW: "application/octet-stream",
+ UPayloadFormat.UPAYLOAD_FORMAT_TEXT: "text/plain",
+ UPayloadFormat.UPAYLOAD_FORMAT_SOMEIP: "application/x-someip",
+ UPayloadFormat.UPAYLOAD_FORMAT_SOMEIP_TLV: "application/x-someip_tlv",
+ }.get(payload_format, "")
+
+ @staticmethod
+ def get_upayload_format_from_content_type(contenttype: str):
+ """
+ Retrieves the payload format enumeration based on the provided content type.
+ @param contenttype The content type string representing the format of the payload.
+ @return The corresponding UPayloadFormat enumeration based on the content type.
+ """
+ if contenttype is None:
+ return UPayloadFormat.UPAYLOAD_FORMAT_PROTOBUF
+
+ content_type_mapping = {
+ "application/json": UPayloadFormat.UPAYLOAD_FORMAT_JSON,
+ "application/octet-stream": UPayloadFormat.UPAYLOAD_FORMAT_RAW,
+ "text/plain": UPayloadFormat.UPAYLOAD_FORMAT_TEXT,
+ "application/x-someip": UPayloadFormat.UPAYLOAD_FORMAT_SOMEIP,
+ "application/x-someip_tlv": UPayloadFormat.UPAYLOAD_FORMAT_SOMEIP_TLV,
+ }
+ return content_type_mapping.get(contenttype, UPayloadFormat.UPAYLOAD_FORMAT_PROTOBUF)
+
+ @staticmethod
+ def fromMessage(message: UMessage) -> CloudEvent:
+ """
+ Get the Cloudevent from the UMessage
+ Note: For now, only the value format of UPayload is supported in the SDK.If the UPayload has a reference, it
+ needs to be copied to CloudEvent.
+ @param message The UMessage protobuf containing the data
+ @return returns the cloud event
+ """
+ attributes = message.attributes
+ data = bytearray()
+ json_attributes = {"id": LongUuidSerializer.instance().serialize(attributes.id),
+ "source": LongUriSerializer().serialize(message.source),
+ "type": UCloudEvent.get_event_type(attributes.type)}
+ contenttype = UCloudEvent.get_content_type_from_upayload_format(message.payload.format)
+ if contenttype:
+ json_attributes['datacontenttype'] = "application/x-protobuf"
+
+ # IMPORTANT: Currently, ONLY the VALUE format is supported in the SDK!
+ if message.payload.HasField('value'):
+ data = message.payload.value
+ if attributes.HasField('ttl'):
+ json_attributes['ttl'] = attributes.ttl
+ if attributes.priority > 0:
+ json_attributes['priority'] = UPriority.Name(attributes.priority)
+ if attributes.HasField('token'):
+ json_attributes['token'] = attributes.token
+ if attributes.HasField('sink'):
+ json_attributes['sink'] = LongUriSerializer().serialize(attributes.sink)
+ if attributes.HasField('commstatus'):
+ json_attributes['commstatus'] = attributes.commstatus
+ if attributes.HasField('reqid'):
+ json_attributes['reqid'] = LongUuidSerializer.instance().serialize(attributes.reqid)
+ if attributes.HasField('permission_level'):
+ json_attributes['plevel'] = attributes.permission_level
+
+ cloud_event = CloudEvent(json_attributes, data)
+ return cloud_event
+
+ @staticmethod
+ def toMessage(event: CloudEvent) -> UMessage:
+ """
+
+ Get the UMessage from the cloud event
+ @param event The CloudEvent containing the data.
+ @return returns the UMessage
+ """
+ if event is None:
+ raise ValueError("Cloud Event can't be None")
+ source = LongUriSerializer().deserialize(UCloudEvent.get_source(event))
+ payload = UPayload(
+ format=UCloudEvent.get_upayload_format_from_content_type(UCloudEvent.get_data_content_type(event)),
+ value=UCloudEvent.get_payload(event).SerializeToString())
+ attributes = UAttributes(id=LongUuidSerializer.instance().deserialize(UCloudEvent.get_id(event)),
+ type=UCloudEvent.get_message_type(UCloudEvent.get_type(event)))
+ if UCloudEvent.has_communication_status_problem(event):
+ attributes.commstatus = UCloudEvent.get_communication_status(event)
+ priority = UCloudEvent.get_priority(event)
+ if priority is not None:
+ attributes.priority = priority
+
+ sink = UCloudEvent.get_sink(event)
+ if sink is not None:
+ attributes.sink.CopyFrom(LongUriSerializer().deserialize(sink))
+
+ reqid = UCloudEvent.get_request_id(event)
+ if reqid is not None:
+ attributes.reqid.CopyFrom(LongUuidSerializer().deserialize(reqid))
+
+ ttl = UCloudEvent.get_ttl(event)
+ if ttl is not None:
+ attributes.ttl = ttl
+
+ token = UCloudEvent.get_token(event)
+ if token is not None:
+ attributes.token = token
+
+ plevel = UCloudEvent.extract_integer_value_from_attributes("plevel", event)
+ if plevel is not None:
+ attributes.permission_level = plevel
+
+ return UMessage(attributes=attributes, payload=payload, source=source)
diff --git a/uprotocol/proto/umessage_pb2.py b/uprotocol/proto/umessage_pb2.py
new file mode 100644
index 0000000..f183abe
--- /dev/null
+++ b/uprotocol/proto/umessage_pb2.py
@@ -0,0 +1,29 @@
+# -*- coding: utf-8 -*-
+# Generated by the protocol buffer compiler. DO NOT EDIT!
+# source: umessage.proto
+"""Generated protocol buffer code."""
+from google.protobuf import descriptor as _descriptor
+from google.protobuf import descriptor_pool as _descriptor_pool
+from google.protobuf import symbol_database as _symbol_database
+from google.protobuf.internal import builder as _builder
+# @@protoc_insertion_point(imports)
+
+_sym_db = _symbol_database.Default()
+
+
+import uprotocol.proto.uattributes_pb2 as uattributes__pb2
+import uprotocol.proto.upayload_pb2 as upayload__pb2
+import uprotocol.proto.uri_pb2 as uri__pb2
+
+
+DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n\x0eumessage.proto\x12\x0cuprotocol.v1\x1a\x11uattributes.proto\x1a\x0eupayload.proto\x1a\turi.proto\"\x86\x01\n\x08UMessage\x12\"\n\x06source\x18\x01 \x01(\x0b\x32\x12.uprotocol.v1.UUri\x12-\n\nattributes\x18\x02 \x01(\x0b\x32\x19.uprotocol.v1.UAttributes\x12\'\n\x07payload\x18\x03 \x01(\x0b\x32\x16.uprotocol.v1.UPayloadB+\n\x18org.eclipse.uprotocol.v1B\rUMessageProtoP\x01\x62\x06proto3')
+
+_globals = globals()
+_builder.BuildMessageAndEnumDescriptors(DESCRIPTOR, _globals)
+_builder.BuildTopDescriptorsAndMessages(DESCRIPTOR, 'umessage_pb2', _globals)
+if _descriptor._USE_C_DESCRIPTORS == False:
+ _globals['DESCRIPTOR']._options = None
+ _globals['DESCRIPTOR']._serialized_options = b'\n\030org.eclipse.uprotocol.v1B\rUMessageProtoP\001'
+ _globals['_UMESSAGE']._serialized_start=79
+ _globals['_UMESSAGE']._serialized_end=213
+# @@protoc_insertion_point(module_scope)