15808f684SSatish Balayfrom petsc4py import PETSc 2*6eca135dSLisandro Dalcinimport os 35808f684SSatish Balayimport unittest 46f336411SStefano Zampiniimport gc 56f336411SStefano Zampiniimport weakref 65808f684SSatish Balay 75808f684SSatish Balay# -------------------------------------------------------------------- 85808f684SSatish Balay 95808f684SSatish Balay## gc.set_debug((gc.DEBUG_STATS | 105808f684SSatish Balay## gc.DEBUG_LEAK) & 115808f684SSatish Balay## ~gc.DEBUG_SAVEALL) 125808f684SSatish Balay 135808f684SSatish Balay# -------------------------------------------------------------------- 145808f684SSatish Balay 15*6eca135dSLisandro DalcinPYSABI = os.path.basename(PETSc.__file__).split(".")[1] == "abi3" 16*6eca135dSLisandro Dalcin 175808f684SSatish Balay 186f336411SStefano Zampiniclass BaseTestGC: 195808f684SSatish Balay def setUp(self): 205808f684SSatish Balay self.obj = self.CLASS().create(comm=PETSc.COMM_SELF) 215808f684SSatish Balay 225808f684SSatish Balay def tearDown(self): 235808f684SSatish Balay wref = self.make_weakref() 245808f684SSatish Balay self.assertTrue(wref() is self.obj) 255808f684SSatish Balay self.obj = None 265808f684SSatish Balay gc.collect() 27*6eca135dSLisandro Dalcin if PYSABI: 28*6eca135dSLisandro Dalcin # garbage collection is not supported 29*6eca135dSLisandro Dalcin # the weak reference is still alive 30*6eca135dSLisandro Dalcin self.assertTrue(wref() is not None) 31*6eca135dSLisandro Dalcin self.assertEqual(wref().getRefCount(), 1) 32*6eca135dSLisandro Dalcin wref().destroy() 33*6eca135dSLisandro Dalcin else: 34*6eca135dSLisandro Dalcin # the weak reference is gone 355808f684SSatish Balay self.assertTrue(wref() is None) 36*6eca135dSLisandro Dalcin del wref 3762e5d2d2SJDBetteridge PETSc.garbage_cleanup() 385808f684SSatish Balay 395808f684SSatish Balay def make_weakref(self): 406f336411SStefano Zampini return weakref.ref(self.obj) 415808f684SSatish Balay 425808f684SSatish Balay def testCycleInSelf(self): 435808f684SSatish Balay self.obj.setAttr('myself', self.obj) 445808f684SSatish Balay 455808f684SSatish Balay def testCycleInMethod(self): 465808f684SSatish Balay self.obj.setAttr('mymeth', self.obj.view) 475808f684SSatish Balay 485808f684SSatish Balay def testCycleInInstance(self): 496f336411SStefano Zampini class A: 506f336411SStefano Zampini pass 516f336411SStefano Zampini 525808f684SSatish Balay a = A() 535808f684SSatish Balay a.obj = self.obj 545808f684SSatish Balay self.obj.setAttr('myinst', a) 555808f684SSatish Balay 565808f684SSatish Balay def testCycleInAllWays(self): 575808f684SSatish Balay self.testCycleInSelf() 585808f684SSatish Balay self.testCycleInMethod() 595808f684SSatish Balay self.testCycleInInstance() 605808f684SSatish Balay 616f336411SStefano Zampini 625808f684SSatish Balay# -------------------------------------------------------------------- 635808f684SSatish Balay 646f336411SStefano Zampini 655808f684SSatish Balayclass TestGCVec(BaseTestGC, unittest.TestCase): 665808f684SSatish Balay CLASS = PETSc.Vec 675808f684SSatish Balay 686f336411SStefano Zampini 695808f684SSatish Balayclass TestGCVecSubType(TestGCVec): 705808f684SSatish Balay CLASS = type('_Vec', (PETSc.Vec,), {}) 715808f684SSatish Balay 726f336411SStefano Zampini 735808f684SSatish Balayclass TestGCMat(BaseTestGC, unittest.TestCase): 745808f684SSatish Balay CLASS = PETSc.Mat 755808f684SSatish Balay 766f336411SStefano Zampini 775808f684SSatish Balayclass TestGCMatSubType(TestGCMat): 785808f684SSatish Balay CLASS = type('_Mat', (PETSc.Mat,), {}) 795808f684SSatish Balay 806f336411SStefano Zampini 815808f684SSatish Balayclass TestGCPC(BaseTestGC, unittest.TestCase): 825808f684SSatish Balay CLASS = PETSc.PC 835808f684SSatish Balay 846f336411SStefano Zampini 855808f684SSatish Balayclass TestGCPCSubType(TestGCPC): 865808f684SSatish Balay CLASS = type('_PC', (PETSc.PC,), {}) 875808f684SSatish Balay 886f336411SStefano Zampini 895808f684SSatish Balayclass TestGCKSP(BaseTestGC, unittest.TestCase): 905808f684SSatish Balay CLASS = PETSc.KSP 915808f684SSatish Balay 926f336411SStefano Zampini 935808f684SSatish Balayclass TestGCKSPSubType(TestGCKSP): 945808f684SSatish Balay CLASS = type('_KSP', (PETSc.KSP,), {}) 955808f684SSatish Balay 966f336411SStefano Zampini 975808f684SSatish Balayclass TestGCSNES(BaseTestGC, unittest.TestCase): 985808f684SSatish Balay CLASS = PETSc.SNES 996f336411SStefano Zampini 1005808f684SSatish Balay def testCycleInAppCtx(self): 1015808f684SSatish Balay self.obj.setAppCtx(self.obj) 1025808f684SSatish Balay 1036f336411SStefano Zampini 1045808f684SSatish Balayclass TestGCSNESSubType(TestGCSNES): 1055808f684SSatish Balay CLASS = type('_SNES', (PETSc.SNES,), {}) 1065808f684SSatish Balay 1076f336411SStefano Zampini 1085808f684SSatish Balayclass TestGCTS(BaseTestGC, unittest.TestCase): 1095808f684SSatish Balay CLASS = PETSc.TS 1106f336411SStefano Zampini 1115808f684SSatish Balay def testCycleInAppCtx(self): 1125808f684SSatish Balay self.obj.setAppCtx(self.obj) 1135808f684SSatish Balay 1146f336411SStefano Zampini 1155808f684SSatish Balayclass TestGCTSSubType(TestGCTS): 1165808f684SSatish Balay CLASS = type('_TS', (PETSc.TS,), {}) 1176f336411SStefano Zampini 1185808f684SSatish Balay def testCycleInAppCtx(self): 1195808f684SSatish Balay self.obj.setAppCtx(self.obj) 1205808f684SSatish Balay 1216f336411SStefano Zampini 1225808f684SSatish Balay# -------------------------------------------------------------------- 1235808f684SSatish Balay 1245808f684SSatish Balayif __name__ == '__main__': 1255808f684SSatish Balay unittest.main() 126