From: <sr...@us...> - 2006-02-03 01:59:47
|
Revision: 574 Author: srmitch Date: 2006-02-02 17:59:28 -0800 (Thu, 02 Feb 2006) ViewCVS: http://svn.sourceforge.net/instantobjects?rev=574&view=rev Log Message: ----------- Changes: 1. Added another test procedure to TestInstantReferences.pas to facilitate memory leak testing for object structures with circular references: A -> B -> C -> A | + -> D -> E then delete E Modified Paths: -------------- trunk/Source/Tests/TestInstantReferences.pas Modified: trunk/Source/Tests/TestInstantReferences.pas =================================================================== --- trunk/Source/Tests/TestInstantReferences.pas 2006-02-03 01:24:03 UTC (rev 573) +++ trunk/Source/Tests/TestInstantReferences.pas 2006-02-03 01:59:28 UTC (rev 574) @@ -58,14 +58,19 @@ procedure TestCircularReferences2; // A -> <- B // | - // +-> C + // + -> C // then delete C procedure TestCircularReferences3; - // A->B->C->A + // A -> B -> C -> A // | - // +->D + // + -> D // then delete D procedure TestCircularReferences4; + // A -> B -> C -> A + // | + // + -> D -> E + // then delete E + procedure TestCircularReferences5; end; TestTInstantEmbReferences = class(TTestCase) @@ -362,7 +367,7 @@ // A -> <- B // | -// +-> C +// + -> C // then delete C procedure TestTInstantReferences_Leak.TestCircularReferences3; var @@ -413,9 +418,9 @@ AssertEquals('FOwner.EmployeeCount', 1, FOwner.EmployeeCount); end; -// A->B->C->A +// A -> B -> C -> A // | -// +->D +// + -> D // then delete D procedure TestTInstantReferences_Leak.TestCircularReferences4; var @@ -488,6 +493,96 @@ end; end; +// A -> B -> C -> A +// | +// + -> D -> E +// then delete E +procedure TestTInstantReferences_Leak.TestCircularReferences5; +var + vPerson: TPerson; + vProject1: TProject; + vProject2: TProject; + vPerson2: TPerson; +begin + FOwner.Name := 'Owner'; + + vPerson := TPerson.Create(FConn); + try + AssertNotNull(vPerson); + vPerson.Name := 'vPerson'; + + vPerson.EmployBy(FOwner); + AssertNotNull(vPerson.Employer); + AssertEquals('vPerson.Employer.Name A', 'Owner', vPerson.Employer.Name); + FOwner.DeleteEmployee(0); + + vProject1 := TProject.Create(FConn); + try + AssertNotNull(vProject1); + vProject1.Name := 'vProject1'; + vProject1.Manager := vPerson; + FOwner.AddProject(vProject1); + finally + vProject1.Free; + end; + + vProject2 := TProject.Create(FConn); + try + AssertNotNull(vProject2); + vProject2.Name := 'vProject2'; + vPerson2 := TPerson.Create(FConn); + try + AssertNotNull(vPerson2); + vPerson2.Name := 'vPerson2'; + + vProject2.Manager := vPerson2; + finally + vPerson2.Free; + end; + FOwner.AddProject(vProject2); + finally + vProject2.Free; + end; + + FreeAndNil(FOwner); + + AssertEquals('vPerson.RefCount 1', + 2, vPerson.RefCount); + AssertEquals('vPerson.ReferencedBy.Count 1', + 1, vPerson.ReferencedBy.Count); + + AssertEquals('vPerson.Employer.RefCount 1', + 1, vPerson.Employer.RefCount); + AssertEquals('vPerson.Employer.ReferencedBy.Count 1', + 1, vPerson.Employer.ReferencedBy.Count); + + AssertEquals('vPerson.Employer.EmployeeCount 1', + 0, vPerson.Employer.EmployeeCount); + + AssertEquals('vPerson.Employer.ProjectCount 1', + 2, vPerson.Employer.ProjectCount); + AssertEquals('vPerson.Employer.Projects[0].RefCount 1', + 1, vPerson.Employer.Projects[0].RefCount); + AssertEquals('vPerson.Employer.Projects[0].ReferencedBy.Count 1', + 1, vPerson.Employer.Projects[0].ReferencedBy.Count); + AssertEquals('vPerson.Employer.Projects[1].RefCount 1', + 1, vPerson.Employer.Projects[1].RefCount); + AssertEquals('vPerson.Employer.Projects[1].ReferencedBy.Count 1', + 1, vPerson.Employer.Projects[1].ReferencedBy.Count); + + AssertEquals('vPerson.Employer.Projects[1].Manager.RefCount 1', + 1, vPerson.Employer.Projects[1].Manager.RefCount); + AssertEquals('vPerson.Employer.Projects[1].Manager.ReferencedBy.Count 1', + 1, vPerson.Employer.Projects[1].Manager.ReferencedBy.Count); + + vPerson.Employer.Projects[1].Manager := nil; + AssertEquals('vPerson.Employer.ProjectCount 1', + 2, vPerson.Employer.ProjectCount); + finally + vPerson.Free; + end; +end; + function TestTInstantEmbReferences.RefsEmbeddedCompare(Holder, Obj1, Obj2: TInstantObject): Integer; var |
From: <the...@us...> - 2006-02-03 21:49:56
|
Revision: 578 Author: the_kique Date: 2006-02-03 13:49:42 -0800 (Fri, 03 Feb 2006) ViewCVS: http://svn.sourceforge.net/instantobjects?rev=578&view=rev Log Message: ----------- Test case to demostrate the infinite loop in FreeCircularReferences Modified Paths: -------------- trunk/Source/Tests/TestInstantReferences.pas Modified: trunk/Source/Tests/TestInstantReferences.pas =================================================================== --- trunk/Source/Tests/TestInstantReferences.pas 2006-02-03 04:14:57 UTC (rev 577) +++ trunk/Source/Tests/TestInstantReferences.pas 2006-02-03 21:49:42 UTC (rev 578) @@ -71,6 +71,8 @@ // + -> D -> E // then delete E procedure TestCircularReferences5; + //Emulate the retrive behavior + procedure TestCircularReferencesRetrive; end; TestTInstantEmbReferences = class(TTestCase) @@ -574,7 +576,7 @@ 1, vPerson.Employer.Projects[1].Manager.RefCount); AssertEquals('vPerson.Employer.Projects[1].Manager.ReferencedBy.Count 1', 1, vPerson.Employer.Projects[1].Manager.ReferencedBy.Count); - + vPerson.Employer.Projects[1].Manager := nil; AssertEquals('vPerson.Employer.ProjectCount 1', 2, vPerson.Employer.ProjectCount); @@ -583,6 +585,58 @@ end; end; +procedure TestTInstantReferences_Leak.TestCircularReferencesRetrive; +var + vPerson1: TPerson; + vPerson2: TPerson; + vProject1: TProject; +begin + FOwner.Name := 'Owner'; + + vPerson1 := TPerson.Create(FConn); //A + try + AssertNotNull(vPerson1); + vPerson1.Name := 'vPerson1'; + //A -> B + vPerson1.EmployBy(FOwner); + + AssertNotNull(vPerson1.Employer); + AssertEquals('vPerson1.Employer.Name A', 'Owner', vPerson1.Employer.Name); + + vProject1 := TProject.Create(FConn); //C + try + AssertNotNull(vProject1); + vProject1.Name := 'vProject1'; + //A -> B -> C -> A + vProject1.Manager := vPerson1; + FOwner.AddProject(vProject1); + + vPerson2 := TPerson.Create(FConn); //D + try + AssertNotNull(vPerson1); + vPerson2.Name := 'vPerson1'; + //A -> B -> C -> A + // | + // +-> D + vPerson2.EmployBy(FOwner); + AssertNotNull(vPerson2.Employer); + AssertEquals('vPerson2.Employer.Name A', 'Owner', vPerson2.Employer.Name); + //Decrement the RefCount to emulate the Retrive constructor + FOwner.Release; + vPerson1.Release; + finally + //This cause an infinite loop and close the test application + vPerson2.Free; + end; + finally + vProject1.Free; + end; + + finally + vPerson1.Free; + end; +end; + function TestTInstantEmbReferences.RefsEmbeddedCompare(Holder, Obj1, Obj2: TInstantObject): Integer; var |
From: <sr...@us...> - 2006-02-13 22:04:10
|
Revision: 589 Author: srmitch Date: 2006-02-13 14:03:48 -0800 (Mon, 13 Feb 2006) ViewCVS: http://svn.sourceforge.net/instantobjects?rev=589&view=rev Log Message: ----------- Changed last test submitted to emulate the retrieve behavior so that it does not run by default as it crashes GUITestRunner with stack overflow. Left in for future consideration by changing class visibility to public. Modified Paths: -------------- trunk/Source/Tests/TestInstantReferences.pas Modified: trunk/Source/Tests/TestInstantReferences.pas =================================================================== --- trunk/Source/Tests/TestInstantReferences.pas 2006-02-13 17:57:13 UTC (rev 588) +++ trunk/Source/Tests/TestInstantReferences.pas 2006-02-13 22:03:48 UTC (rev 589) @@ -46,6 +46,13 @@ public procedure SetUp; override; procedure TearDown; override; + + // Emulate the retrieve behavior + // Feb 2006 - IO Beta 2 + // Do not run by default as it crashes + // GUITestRunner with stack overflow. + // Left here for future consideration. + procedure TestCircularReferencesRetrieve; published procedure TestAddEmbeddedObject; procedure TestAddExternalObject; @@ -71,8 +78,6 @@ // + -> D -> E // then delete E procedure TestCircularReferences5; - //Emulate the retrive behavior - procedure TestCircularReferencesRetrive; end; TestTInstantEmbReferences = class(TTestCase) @@ -506,9 +511,9 @@ vProject2: TProject; vPerson2: TPerson; begin - FOwner.Name := 'Owner'; + FOwner.Name := 'Owner'; // B - vPerson := TPerson.Create(FConn); + vPerson := TPerson.Create(FConn); // A try AssertNotNull(vPerson); vPerson.Name := 'vPerson'; @@ -518,7 +523,7 @@ AssertEquals('vPerson.Employer.Name A', 'Owner', vPerson.Employer.Name); FOwner.DeleteEmployee(0); - vProject1 := TProject.Create(FConn); + vProject1 := TProject.Create(FConn); // C try AssertNotNull(vProject1); vProject1.Name := 'vProject1'; @@ -528,11 +533,11 @@ vProject1.Free; end; - vProject2 := TProject.Create(FConn); + vProject2 := TProject.Create(FConn); // D try AssertNotNull(vProject2); vProject2.Name := 'vProject2'; - vPerson2 := TPerson.Create(FConn); + vPerson2 := TPerson.Create(FConn); // E try AssertNotNull(vPerson2); vPerson2.Name := 'vPerson2'; @@ -585,7 +590,7 @@ end; end; -procedure TestTInstantReferences_Leak.TestCircularReferencesRetrive; +procedure TestTInstantReferences_Leak.TestCircularReferencesRetrieve; var vPerson1: TPerson; vPerson2: TPerson; @@ -613,15 +618,15 @@ vPerson2 := TPerson.Create(FConn); //D try - AssertNotNull(vPerson1); - vPerson2.Name := 'vPerson1'; + AssertNotNull(vPerson2); + vPerson2.Name := 'vPerson2'; //A -> B -> C -> A // | // +-> D vPerson2.EmployBy(FOwner); AssertNotNull(vPerson2.Employer); AssertEquals('vPerson2.Employer.Name A', 'Owner', vPerson2.Employer.Name); - //Decrement the RefCount to emulate the Retrive constructor + //Decrement the RefCount to emulate the Retrieve constructor FOwner.Release; vPerson1.Release; finally |