VPP-1508: Python3 tests. Explicitly specify string formatting.
[vpp.git] / test / remote_test.py
index 40e7984..43cb9b9 100644 (file)
@@ -6,9 +6,11 @@ import unittest
 from multiprocessing import Process, Pipe
 from pickle import dumps
 
+import six
 from six import moves
 
 from framework import VppTestCase
+from enum import Enum
 
 
 class SerializableClassCopy(object):
@@ -134,7 +136,7 @@ class RemoteClass(Process):
                isinstance(val, RemoteClassAttr):
                 mutable_args[i] = val.get_remote_value()
         args = tuple(mutable_args)
-        for key, val in kwargs.iteritems():
+        for key, val in six.iteritems(kwargs):
             if isinstance(val, RemoteClass) or \
                isinstance(val, RemoteClassAttr):
                 kwargs[key] = val.get_remote_value()
@@ -220,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
@@ -244,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):