1*89c4ff92SAndroid Build Coastguard Worker# Copyright © 2020 Arm Ltd and Contributors. All rights reserved. 2*89c4ff92SAndroid Build Coastguard Worker# SPDX-License-Identifier: MIT 3*89c4ff92SAndroid Build Coastguard Workerimport inspect 4*89c4ff92SAndroid Build Coastguard Workerfrom typing import Tuple 5*89c4ff92SAndroid Build Coastguard Worker 6*89c4ff92SAndroid Build Coastguard Workerimport pytest 7*89c4ff92SAndroid Build Coastguard Worker 8*89c4ff92SAndroid Build Coastguard Workerimport pyarmnn._generated.pyarmnn as generated_armnn 9*89c4ff92SAndroid Build Coastguard Workerimport pyarmnn._generated.pyarmnn as generated_deserializer 10*89c4ff92SAndroid Build Coastguard Workerimport pyarmnn._generated.pyarmnn_onnxparser as generated_onnx 11*89c4ff92SAndroid Build Coastguard Workerimport pyarmnn._generated.pyarmnn_tfliteparser as generated_tflite 12*89c4ff92SAndroid Build Coastguard Worker 13*89c4ff92SAndroid Build Coastguard Workerswig_independent_classes = ('IBackend', 14*89c4ff92SAndroid Build Coastguard Worker 'IDeviceSpec', 15*89c4ff92SAndroid Build Coastguard Worker 'IConnectableLayer', 16*89c4ff92SAndroid Build Coastguard Worker 'IInputSlot', 17*89c4ff92SAndroid Build Coastguard Worker 'IOutputSlot', 18*89c4ff92SAndroid Build Coastguard Worker 'IProfiler') 19*89c4ff92SAndroid Build Coastguard Worker 20*89c4ff92SAndroid Build Coastguard Worker 21*89c4ff92SAndroid Build Coastguard Workerdef get_classes(swig_independent_classes: Tuple): 22*89c4ff92SAndroid Build Coastguard Worker # We need to ignore some swig generated_armnn classes. This is because some are abstract classes 23*89c4ff92SAndroid Build Coastguard Worker # They cannot be created with the swig generated_armnn wrapper, therefore they don't need a destructor. 24*89c4ff92SAndroid Build Coastguard Worker # Swig also generates its own meta class - this needs to be ignored. 25*89c4ff92SAndroid Build Coastguard Worker ignored_class_names = (*swig_independent_classes, '_SwigNonDynamicMeta') 26*89c4ff92SAndroid Build Coastguard Worker return list(filter(lambda x: x[0] not in ignored_class_names, 27*89c4ff92SAndroid Build Coastguard Worker inspect.getmembers(generated_armnn, inspect.isclass) + 28*89c4ff92SAndroid Build Coastguard Worker inspect.getmembers(generated_deserializer, inspect.isclass) + 29*89c4ff92SAndroid Build Coastguard Worker inspect.getmembers(generated_tflite, inspect.isclass) + 30*89c4ff92SAndroid Build Coastguard Worker inspect.getmembers(generated_onnx, inspect.isclass))) 31*89c4ff92SAndroid Build Coastguard Worker 32*89c4ff92SAndroid Build Coastguard Worker 33*89c4ff92SAndroid Build Coastguard Worker@pytest.mark.parametrize("class_instance", get_classes(swig_independent_classes), ids=lambda x: 'class={}'.format(x[0])) 34*89c4ff92SAndroid Build Coastguard Workerclass TestPyOwnedClasses: 35*89c4ff92SAndroid Build Coastguard Worker 36*89c4ff92SAndroid Build Coastguard Worker def test_destructors_exist_per_class(self, class_instance): 37*89c4ff92SAndroid Build Coastguard Worker assert getattr(class_instance[1], '__swig_destroy__', None) 38*89c4ff92SAndroid Build Coastguard Worker 39*89c4ff92SAndroid Build Coastguard Worker def test_owned(self, class_instance): 40*89c4ff92SAndroid Build Coastguard Worker assert getattr(class_instance[1], 'thisown', None) 41*89c4ff92SAndroid Build Coastguard Worker 42*89c4ff92SAndroid Build Coastguard Worker 43*89c4ff92SAndroid Build Coastguard Worker@pytest.mark.parametrize("class_instance", swig_independent_classes) 44*89c4ff92SAndroid Build Coastguard Workerclass TestPyIndependentClasses: 45*89c4ff92SAndroid Build Coastguard Worker 46*89c4ff92SAndroid Build Coastguard Worker def test_destructors_does_not_exist_per_class(self, class_instance): 47*89c4ff92SAndroid Build Coastguard Worker assert not getattr(class_instance[1], '__swig_destroy__', None) 48*89c4ff92SAndroid Build Coastguard Worker 49*89c4ff92SAndroid Build Coastguard Worker def test_not_owned(self, class_instance): 50*89c4ff92SAndroid Build Coastguard Worker assert not getattr(class_instance[1], 'thisown', None) 51