Remote Test: fix serialization (dict, Enum) 51/17751/3
authorJakub Grajciar <jgrajcia@cisco.com>
Thu, 21 Feb 2019 11:01:31 +0000 (12:01 +0100)
committerNeale Ranns <nranns@cisco.com>
Mon, 25 Feb 2019 19:38:38 +0000 (19:38 +0000)
Change-Id: Ia3f8616cbf424c7f2d29d16cf7a457be6cd1b33a
Signed-off-by: Jakub Grajciar <jgrajcia@cisco.com>
test/remote_test.py

index dfdc630..43cb9b9 100644 (file)
@@ -10,6 +10,7 @@ import six
 from six import moves
 
 from framework import VppTestCase
+from enum import Enum
 
 
 class SerializableClassCopy(object):
@@ -221,7 +222,22 @@ class RemoteClass(Process):
         """
         if self._serializable(obj):
             return obj  # already serializable
+
         copy = SerializableClassCopy()
+
+        """
+        Dictionaries can hold complex values, so we split keys and values into
+        separate lists and serialize them individually.
+        """
+        if (type(obj) is dict):
+            copy.type = type(obj)
+            copy.k_list = list()
+            copy.v_list = list()
+            for k, v in obj.items():
+                copy.k_list.append(self._make_serializable(k))
+                copy.v_list.append(self._make_serializable(v))
+            return copy
+
         # copy at least serializable attributes and properties
         for name, member in inspect.getmembers(obj):
             if name[0] == '_':  # skip private members
@@ -245,10 +261,18 @@ class RemoteClass(Process):
             if type(obj) is tuple:
                 rv = tuple(rv)
             return rv
+        elif (isinstance(obj, Enum)):
+            return obj.value
         else:
             return self._make_obj_serializable(obj)
 
     def _deserialize_obj(self, obj):
+        if (hasattr(obj, 'type')):
+            if obj.type is dict:
+                _obj = dict()
+                for k, v in zip(obj.k_list, obj.v_list):
+                    _obj[self._deserialize(k)] = self._deserialize(v)
+            return _obj
         return obj
 
     def _deserialize(self, obj):