diff --git a/neutron/tests/unit/objects/test_base.py b/neutron/tests/unit/objects/test_base.py index 96909310481..c13d2720cfc 100644 --- a/neutron/tests/unit/objects/test_base.py +++ b/neutron/tests/unit/objects/test_base.py @@ -464,6 +464,7 @@ class _BaseObjectTestCase(object): # make sure all objects are loaded and registered in the registry utils.import_modules_recursively(os.path.dirname(objects.__file__)) self.context = context.get_admin_context() + self._unique_tracker = collections.defaultdict(set) self.db_objs = [ self._test_class.db_model(**self.get_random_db_fields()) for _ in range(3) @@ -503,6 +504,14 @@ class _BaseObjectTestCase(object): if field not in obj_cls.synthetic_fields: generator = FIELD_TYPE_VALUE_GENERATOR_MAP[type(field_obj)] fields[field] = get_value(generator, ip_version) + for keys in obj_cls.unique_keys: + keytup = tuple(keys) + unique_values = tuple(fields[k] for k in keytup) + if unique_values in self._unique_tracker[keytup]: + # if you get a recursion depth error here, it means + # your random generator didn't generate unique values + return self.get_random_object_fields(obj_cls) + self._unique_tracker[keytup].add(unique_values) return fields def get_random_db_fields(self, obj_cls=None):