public void ComplexHierachyOfDependenciesEmulateGCRandomDisposalOrder_Success() { var obj = new TesterClass(new IntPtr[] { }); var obj2 = new TesterClass(new[] { obj.Handle }); var obj3 = new TesterClass(new[] { obj.Handle }); var obj4 = new TesterClass(new[] { obj3.Handle, obj2.Handle }); obj4.Dispose(); Thread.Sleep(200); Assert.IsTrue(obj4.destroyed); Assert.IsFalse(obj.destroyed); Assert.IsFalse(obj2.destroyed); Assert.IsFalse(obj3.destroyed); obj2.Dispose(); Thread.Yield(); Thread.Sleep(200); Assert.IsTrue(obj2.destroyed); Assert.IsFalse(obj.destroyed); Assert.IsFalse(obj3.destroyed); obj3.Dispose(); Thread.Yield(); Thread.Sleep(200); Assert.IsFalse(obj.destroyed); Assert.IsTrue(obj3.destroyed); obj.Dispose(); Thread.Yield(); Thread.Sleep(200); Assert.IsTrue(obj.destroyed); Assert.AreEqual(obj.Handle, obj.destroyedHandle); Assert.AreEqual(obj2.Handle, obj2.destroyedHandle); Assert.AreEqual(obj3.Handle, obj3.destroyedHandle); Assert.AreEqual(obj4.Handle, obj4.destroyedHandle); }
public void CircularDependenciesDisposeAllRemoveOneParent_Success() { var obj = new TesterClass(new IntPtr[] { }); var obj2 = new TesterClass(new[] { obj.Handle }); var obj3 = new TesterClass(new[] { obj2.Handle }); TesterClass.UnmanagedObjectLifecycle.AddParent(typeof(TesterClass).Name, obj.Handle, typeof(TesterClass).Name, obj3.Handle); // Circular parent Assert.IsFalse(obj.destroyed); Assert.IsFalse(obj2.destroyed); Assert.IsFalse(obj3.destroyed); obj.Dispose(); obj2.Dispose(); obj3.Dispose(); Thread.Yield(); Thread.Sleep(200); Assert.IsFalse(obj.destroyed); Assert.IsFalse(obj2.destroyed); Assert.IsFalse(obj3.destroyed); /* Only way to get objects destroyed is by removing one parent to destroy the circle */ TesterClass.UnmanagedObjectLifecycle.RemoveParent(typeof(TesterClass).Name, obj.Handle, typeof(TesterClass).Name, obj3.Handle); Thread.Yield(); Thread.Sleep(200); Assert.IsTrue(obj.destroyed); Assert.IsTrue(obj2.destroyed); Assert.IsTrue(obj3.destroyed); Assert.AreEqual(obj.Handle, obj.destroyedHandle); Assert.AreEqual(obj2.Handle, obj2.destroyedHandle); Assert.AreEqual(obj3.Handle, obj3.destroyedHandle); }
public void BasicTest_Success() { var obj = new TesterClass(new IntPtr[] {}); Assert.IsFalse(obj.destroyed); obj.Dispose(); Thread.Sleep(200); Assert.IsTrue(obj.destroyed); Assert.AreEqual(obj.Handle, obj.destroyedHandle); }
public void MultiCircularDependenciesDisposeAllRemoveDependencies_Success() { var obj = new TesterClass(new IntPtr[] { }); var obj2 = new TesterClass(new[] { obj.Handle }); var obj3 = new TesterClass(new[] { obj2.Handle, obj.Handle }); TesterClass.UnmanagedObjectLifecycle.AddParent(typeof(TesterClass).Name, obj.Handle, typeof(TesterClass).Name, obj3.Handle); // Circular parent TesterClass.UnmanagedObjectLifecycle.AddParent(typeof(TesterClass).Name, obj.Handle, typeof(TesterClass).Name, obj2.Handle); // Circular parent TesterClass.UnmanagedObjectLifecycle.AddParent(typeof(TesterClass).Name, obj2.Handle, typeof(TesterClass).Name, obj3.Handle); // Circular parent Assert.IsFalse(obj.destroyed); Assert.IsFalse(obj2.destroyed); Assert.IsFalse(obj3.destroyed); obj.Dispose(); Thread.Yield(); Thread.Sleep(200); Assert.IsFalse(obj.destroyed); Assert.IsFalse(obj2.destroyed); Assert.IsFalse(obj3.destroyed); obj2.Dispose(); Thread.Yield(); Thread.Sleep(200); Assert.IsFalse(obj.destroyed); Assert.IsFalse(obj2.destroyed); Assert.IsFalse(obj3.destroyed); obj3.Dispose(); Thread.Sleep(200); Assert.IsFalse(obj.destroyed); Assert.IsFalse(obj2.destroyed); Assert.IsFalse(obj3.destroyed); TesterClass.UnmanagedObjectLifecycle.RemoveParent(typeof(TesterClass).Name, obj.Handle, typeof(TesterClass).Name, obj3.Handle); Thread.Yield(); Thread.Sleep(200); Assert.IsFalse(obj.destroyed); Assert.IsFalse(obj2.destroyed); Assert.IsFalse(obj3.destroyed); TesterClass.UnmanagedObjectLifecycle.RemoveParent(typeof(TesterClass).Name, obj.Handle, typeof(TesterClass).Name, obj2.Handle); Thread.Yield(); Thread.Sleep(200); Assert.IsFalse(obj.destroyed); Assert.IsFalse(obj2.destroyed); Assert.IsFalse(obj3.destroyed); TesterClass.UnmanagedObjectLifecycle.RemoveParent(typeof(TesterClass).Name, obj2.Handle, typeof(TesterClass).Name, obj3.Handle); Thread.Yield(); Thread.Sleep(200); Assert.IsTrue(obj.destroyed); Assert.IsTrue(obj2.destroyed); Assert.IsTrue(obj3.destroyed); Assert.AreEqual(obj.Handle, obj.destroyedHandle); Assert.AreEqual(obj2.Handle, obj2.destroyedHandle); Assert.AreEqual(obj3.Handle, obj3.destroyedHandle); }
public void RegisterObjectTwice_Success() { var obj = new TesterClass(new IntPtr[] { }); Assert.IsFalse(obj.destroyed); TesterClass.UnmanagedObjectLifecycle.Register(typeof(TesterClass).Name, obj.Handle, obj.GetDestroyDelegate()); Assert.IsFalse(obj.destroyed); obj.Dispose(); Thread.Yield(); Thread.Sleep(200); Assert.IsFalse(obj.destroyed); TesterClass.UnmanagedObjectLifecycle.Unregister(typeof(TesterClass).Name, obj.Handle); Thread.Yield(); Thread.Sleep(200); Assert.IsTrue(obj.destroyed); Assert.AreEqual(obj.Handle, obj.destroyedHandle); }
public void BasicTestTwoDifferentTypeNames_Success() { var obj = new TesterClass(new IntPtr[] { }); TesterClass.UnmanagedObjectLifecycle.Register("AnotherClass", obj.Handle); TesterClass.UnmanagedObjectLifecycle.Unregister("AnotherClass", obj.Handle); TesterClass.UnmanagedObjectLifecycle.Unregister("AnotherClass", obj.Handle); Thread.Yield(); Thread.Sleep(200); Assert.IsTrue(_raisedException is EObjectNotFound <string, IntPtr>); _raisedException = null; obj.Dispose(); Thread.Yield(); Thread.Sleep(200); Assert.IsTrue(obj.destroyed); Assert.AreEqual(obj.Handle, obj.destroyedHandle); }
public void SimpleParentDisposeLeafLast_Success() { var obj = new TesterClass(new IntPtr[] {}); var obj2 = new TesterClass(new[] { obj.Handle }); obj.Dispose(); Thread.Yield(); Thread.Sleep(200); Assert.IsFalse(obj.destroyed); Assert.IsFalse(obj2.destroyed); obj2.Dispose(); Thread.Yield(); Thread.Sleep(200); Assert.IsTrue(obj.destroyed); Assert.IsTrue(obj2.destroyed); Assert.AreEqual(obj.Handle, obj.destroyedHandle); Assert.AreEqual(obj2.Handle, obj2.destroyedHandle); }
public void SimpleParentDisposeByRemovingParent_Success() { var obj = new TesterClass(new IntPtr[] { }); var obj2 = new TesterClass(new[] { obj.Handle }); obj.Dispose(); Thread.Sleep(200); Assert.IsFalse(obj.destroyed); Assert.IsFalse(obj2.destroyed); TesterClass.UnmanagedObjectLifecycle.RemoveParent(typeof(TesterClass).Name, obj2.Handle, typeof(TesterClass).Name, obj.Handle); Thread.Yield(); Thread.Sleep(200); Assert.IsTrue(obj.destroyed); Assert.IsFalse(obj2.destroyed); obj2.Dispose(); Thread.Yield(); Thread.Sleep(200); Assert.IsTrue(obj2.destroyed); Assert.AreEqual(obj.Handle, obj.destroyedHandle); Assert.AreEqual(obj2.Handle, obj2.destroyedHandle); }
public void LinearHierachyOfDependenciesDisposeLeafLast_Success() { var obj = new TesterClass(new IntPtr[] { }); var obj2 = new TesterClass(new [] { obj.Handle }); var obj3 = new TesterClass(new[] { obj2.Handle }); obj.Dispose(); obj2.Dispose(); Thread.Sleep(200); Assert.IsFalse(obj.destroyed); Assert.IsFalse(obj2.destroyed); Assert.IsFalse(obj3.destroyed); obj3.Dispose(); Thread.Yield(); Thread.Sleep(200); Assert.IsTrue(obj.destroyed); Assert.IsTrue(obj2.destroyed); Assert.IsTrue(obj3.destroyed); Assert.AreEqual(obj.Handle, obj.destroyedHandle); Assert.AreEqual(obj2.Handle, obj2.destroyedHandle); Assert.AreEqual(obj3.Handle, obj3.destroyedHandle); }