-#!/usr/bin/env python
+#!/usr/bin/env python3
import inspect
import os
import unittest
+from framework import VppTestCase
from multiprocessing import Process, Pipe
from pickle import dumps
-
import six
from six import moves
+import sys
-from framework import VppTestCase
-from aenum import Enum
+if sys.version_info < (3,):
+ from aenum import IntEnum, IntFlag
+else:
+ from enum import IntEnum, IntFlag
class SerializableClassCopy(object):
return
self._path.append(attr)
self._remote._remote_exec(RemoteClass.SETATTR, self.path_to_str(),
- True, value=val)
+ value=val)
def __call__(self, *args, **kwargs):
- ret = True if 'vapi' in self.path_to_str() else False
return self._remote._remote_exec(RemoteClass.CALL, self.path_to_str(),
- ret, *args, **kwargs)
+ *args, **kwargs)
class RemoteClass(Process):
return
setattr(RemoteClassAttr(self, None), attr, val)
- def _remote_exec(self, op, path=None, ret=True, *args, **kwargs):
+ def _remote_exec(self, op, path=None, *args, **kwargs):
"""
Execute given operation on a given, possibly nested, member remotely.
"""
args = self._make_serializable(args)
kwargs = self._make_serializable(kwargs)
self._pipe[RemoteClass.PIPE_PARENT].send((op, path, args, kwargs))
- if not ret:
- # no return value expected
- return None
timeout = self._timeout
# adjust timeout specifically for the .sleep method
- if path.split('.')[-1] == 'sleep':
+ if path is not None and path.split('.')[-1] == 'sleep':
if args and isinstance(args[0], (long, int)):
timeout += args[0]
elif 'timeout' in kwargs:
if name[0] == '_':
if name in ['__weakref__']:
continue
+ if name in ['__dict__']:
+ continue
if not (name.startswith('__') and name.endswith('__')):
continue
if callable(member) and not isinstance(member, property):
continue
if not self._serializable(member):
- continue
+ member = self._make_serializable(member)
setattr(copy, name, member)
return copy
if type(obj) is tuple:
rv = tuple(rv)
return rv
- elif (isinstance(obj, Enum)):
+ elif (isinstance(obj, IntEnum) or isinstance(obj, IntFlag)):
return obj.value
else:
return self._make_obj_serializable(obj)
def quit_remote(self):
""" Quit remote execution """
- self._remote_exec(RemoteClass.QUIT, None, False)
+ self._remote_exec(RemoteClass.QUIT, None)
def get_remote_value(self):
""" Get value of a remotely held object """