public void VerifyAddingSameCallbackReturnsSameWrapper() { JET_CALLBACK callback = CreateCallback(); var callbackWrappers = new CallbackWrappers(); var wrapper = callbackWrappers.Add(callback); Assert.AreEqual(wrapper, callbackWrappers.Add(callback)); }
public void VerifyAddingCallbackReturnsWrapper() { JET_CALLBACK callback = CreateCallback(); var callbackWrappers = new CallbackWrappers(); var wrapper = callbackWrappers.Add(callback); Assert.IsNotNull(callbackWrappers.Add(callback)); }
public void VerifyWrapperIsCollectedWhenCallbackIsCollected() { JET_CALLBACK callback = CreateCallback(); var callbackRef = new WeakReference(callback); var callbackWrappers = new CallbackWrappers(); var wrapperRef = new WeakReference(callbackWrappers.Add(callback)); callback = null; RunFullGarbageCollection(); callbackWrappers.Collect(); RunFullGarbageCollection(); // In DEBUG test code, the objects remain alive for an indeterminate amount of time, for some reason. // Note that they do get collected if a RETAIL test code is used, even if the product code is DEBUG // so it must be something to do with assigning the local variable 'callback' to null and the effect that // it has on garbage collecting weak references to it. #if !DEBUG Assert.IsFalse(callbackRef.IsAlive); Assert.IsFalse(wrapperRef.IsAlive); #endif // Avoid premature collection of these objects GC.KeepAlive(callbackWrappers); }
public void VerifyNativeCallbackIsNotGarbageCollected() { JET_CALLBACK callback = CreateCallback(); var callbackWrappers = new CallbackWrappers(); JetCallbackWrapper wrapper = callbackWrappers.Add(callback); WeakReference weakRef = new WeakReference(wrapper.NativeCallback); RunFullGarbageCollection(); Assert.IsTrue(weakRef.IsAlive); GC.KeepAlive(wrapper); }
public void VerifyWrapperIsAliveWhenCallbackIsAlive() { JET_CALLBACK callback = CreateCallback(); var callbackWrappers = new CallbackWrappers(); var wrapperRef = new WeakReference(callbackWrappers.Add(callback)); RunFullGarbageCollection(); callbackWrappers.Collect(); RunFullGarbageCollection(); Assert.IsTrue(wrapperRef.IsAlive); // Avoid premature collection of these objects GC.KeepAlive(callback); GC.KeepAlive(callbackWrappers); }
/// <summary> /// Create a new wrapped callback. /// </summary> /// <param name="callbackWrappers">The CallbackWrappers to add the callback to.</param> private static void CreateCallbackWrapper(CallbackWrappers callbackWrappers) { callbackWrappers.Add(CreateCallback()); }