#!/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):
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))
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()
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
"""
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
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):