Added OMCI message parsing tests

Change-Id: Ic864446241c3507dcfb389c7e774d0aa79de3b55
diff --git a/voltha/extensions/omci/omci_entities.py b/voltha/extensions/omci/omci_entities.py
index cbeeec5..6c082ad 100644
--- a/voltha/extensions/omci/omci_entities.py
+++ b/voltha/extensions/omci/omci_entities.py
@@ -133,7 +133,28 @@
     mandatory_operations = {OP.Get, OP.Set,
                             OP.GetAllAlarms, OP.GetAllAlarmsNext,
                             OP.MibReset, OP.MibUpload, OP.MibUploadNext}
-    optional_operations = {}
+
+
+class Cardholder(EntityClass):
+    class_id = 5
+    attributes = [
+        ECA(ShortField("managed_entity_id", None), {AA.R}),
+        ECA(ByteField("actual_plugin_unit_type", None), {AA.R}),
+        ECA(ByteField("expected_plugin_unit_type", None), {AA.R, AA.W}),
+        ECA(ByteField("expected_port_count", None), {AA.R, AA.W},
+            optional=True),
+        ECA(StrFixedLenField("expected_equipment_id", None, 20), {AA.R, AA.W},
+            optional=True),
+        ECA(StrFixedLenField("actual_equipment_id", None, 20), {AA.R},
+            optional=True),
+        ECA(ByteField("protection_profile_pointer", None), {AA.R},
+            optional=True),
+        ECA(ByteField("invoke_protection_switch", None), {AA.R, AA.W},
+            optional=True),
+        ECA(ByteField("arc", None), {AA.R, AA.W}),
+        ECA(ByteField("arc_interval", None), {AA.R, AA.W}),
+    ]
+    mandatory_operations = {OP.Get, OP.Set}
 
 
 class CircuitPack(EntityClass):
diff --git a/voltha/extensions/omci/omci_frame.py b/voltha/extensions/omci/omci_frame.py
index 5c8dd20..a762ad8 100644
--- a/voltha/extensions/omci/omci_frame.py
+++ b/voltha/extensions/omci/omci_frame.py
@@ -73,13 +73,21 @@
                 "omci_message", None, OmciGetAllAlarmsNextResponse), align=36),
                 lambda pkt:
                 pkt.message_type == OmciGetAllAlarmsNextResponse.message_id),
+
         ConditionalField(FixedLenField(
             PacketField("omci_message", None, OmciMibUpload), align=36),
+            lambda pkt: pkt.message_type == OmciMibUpload.message_id),
+        ConditionalField(FixedLenField(
+            PacketField("omci_message", None, OmciMibUploadResponse), align=36),
             lambda pkt: pkt.message_type == OmciMibUploadResponse.message_id),
         ConditionalField(FixedLenField(
             PacketField("omci_message", None, OmciMibUploadNext), align=36),
             lambda pkt:
-                pkt.message_type == OmciMibUploadNextResponse.message_id),
+                pkt.message_type == OmciMibUploadNext.message_id),
+        ConditionalField(FixedLenField(
+            PacketField("omci_message", None, OmciMibUploadNextResponse), align=36),
+            lambda pkt: pkt.message_type == OmciMibUploadNextResponse.message_id),
+
         ConditionalField(FixedLenField(
             PacketField("omci_message", None, OmciMibReset), align=36),
             lambda pkt: pkt.message_type == OmciMibReset.message_id),
diff --git a/voltha/extensions/omci/omci_messages.py b/voltha/extensions/omci/omci_messages.py
index 3710702..12956dc 100644
--- a/voltha/extensions/omci/omci_messages.py
+++ b/voltha/extensions/omci/omci_messages.py
@@ -86,7 +86,10 @@
         indices = entity_class.attribute_indices_from_mask(attribute_mask)
         data = {}
         for index in indices:
-            fld = entity_class.attributes[index]._fld
+            try:
+                fld = entity_class.attributes[index]._fld
+            except IndexError, e:
+                raise
             s, value = fld.getfield(pkt, s)
             data[fld.name] = value
         return  s, data
@@ -264,7 +267,8 @@
         ShortField("object_entity_class", None),
         ShortField("object_entity_id", 0),
         ShortField("object_attributes_mask", None),
-        OmciMaskedData("object_data")
+        OmciMaskedData("object_data", entity_class='object_entity_class',
+                       attributes_mask='object_attributes_mask')
     ]