X-Git-Url: https://gerrit.fd.io/r/gitweb?a=blobdiff_plain;f=test%2Fremote_test.py;h=092d3f8d2e7b33b058db2af602bce01a69d2c47e;hb=097fa66b986f06281f603767d321ab13ab6c88c3;hp=f5b3c620cc4d51239341331db6828025e1bb7e33;hpb=e63325e3ca03c847963863446345e6c80a2c0cfd;p=vpp.git diff --git a/test/remote_test.py b/test/remote_test.py index f5b3c620cc4..092d3f8d2e7 100644 --- a/test/remote_test.py +++ b/test/remote_test.py @@ -3,21 +3,14 @@ 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 -if sys.version_info <= (3, 4): - from aenum import IntEnum -else: - from enum import IntEnum -if sys.version_info <= (3, 6): - from aenum import IntFlag -else: - from enum import IntFlag +from framework import VppTestCase +from aenum import Enum class SerializableClassCopy(object): @@ -26,6 +19,9 @@ class SerializableClassCopy(object): """ pass + def __repr__(self): + return '' % self.__dict__ + class RemoteClassAttr(object): """ @@ -51,7 +47,8 @@ class RemoteClassAttr(object): def __getattr__(self, attr): if attr[0] == '_': if not (attr.startswith('__') and attr.endswith('__')): - raise AttributeError + raise AttributeError('tried to get private attribute: %s ', + attr) self._path.append(attr) return self @@ -65,8 +62,9 @@ class RemoteClassAttr(object): True, 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(), - True, *args, **kwargs) + ret, *args, **kwargs) class RemoteClass(Process): @@ -126,7 +124,7 @@ class RemoteClass(Process): if not (attr.startswith('__') and attr.endswith('__')): if hasattr(super(RemoteClass, self), '__getattr__'): return super(RemoteClass, self).__getattr__(attr) - raise AttributeError + raise AttributeError('missing: %s', attr) return RemoteClassAttr(self, attr) def __setattr__(self, attr, val): @@ -144,12 +142,12 @@ class RemoteClass(Process): mutable_args = list(args) for i, val in enumerate(mutable_args): if isinstance(val, RemoteClass) or \ - isinstance(val, RemoteClassAttr): + isinstance(val, RemoteClassAttr): mutable_args[i] = val.get_remote_value() args = tuple(mutable_args) for key, val in six.iteritems(kwargs): if isinstance(val, RemoteClass) or \ - isinstance(val, RemoteClassAttr): + isinstance(val, RemoteClassAttr): kwargs[key] = val.get_remote_value() # send request args = self._make_serializable(args) @@ -251,7 +249,10 @@ class RemoteClass(Process): # copy at least serializable attributes and properties for name, member in inspect.getmembers(obj): - if name[0] == '_': # skip private members + # skip private members and non-writable dunder methods. + if name[0] == '_': + if name in ['__weakref__']: + continue if not (name.startswith('__') and name.endswith('__')): continue if callable(member) and not isinstance(member, property): @@ -273,7 +274,7 @@ class RemoteClass(Process): if type(obj) is tuple: rv = tuple(rv) return rv - elif (isinstance(obj, IntEnum) or isinstance(obj, IntFlag)): + elif (isinstance(obj, Enum)): return obj.value else: return self._make_obj_serializable(obj) @@ -360,7 +361,7 @@ class RemoteVppTestCase(VppTestCase): @classmethod def setUpClass(cls): - # fork new process before clinet connects to VPP + # fork new process before client connects to VPP cls.remote_test = RemoteClass(RemoteVppTestCase) # start remote process @@ -408,6 +409,10 @@ class RemoteVppTestCase(VppTestCase): super(RemoteVppTestCase, cls).setUpClass() os.environ = orig_env + @classmethod + def tearDownClass(cls): + super(RemoteVppTestCase, cls).tearDownClass() + @unittest.skip("Empty test") def emptyTest(self): """ Do nothing """