VPP-1508: Python3 tests. Explicitly specify string formatting.
[vpp.git] / test / remote_test.py
index 1659500..43cb9b9 100644 (file)
@@ -1,11 +1,16 @@
 #!/usr/bin/env python
 
+import inspect
 import os
 import unittest
-import inspect
 from multiprocessing import Process, Pipe
-from pickle import dumps, PicklingError
+from pickle import dumps
+
+import six
+from six import moves
+
 from framework import VppTestCase
+from enum import Enum
 
 
 class SerializableClassCopy(object):
@@ -99,7 +104,7 @@ class RemoteClass(Process):
         self._pipe = Pipe()  # pipe for input/output arguments
 
     def __repr__(self):
-        return repr(RemoteClassAttr(self, None))
+        return moves.reprlib.repr(RemoteClassAttr(self, None))
 
     def __str__(self):
         return str(RemoteClassAttr(self, None))
@@ -131,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()
@@ -191,7 +196,7 @@ class RemoteClass(Process):
     def _get_local_repr(self, path):
         try:
             obj = self._get_local_object(path)
-            return repr(obj)
+            return moves.reprlib.repr(obj)
         except AttributeError:
             return None
 
@@ -217,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
@@ -241,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):